套接字通信(TCP)

Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信。通过建立socket连接,可为通信双方的数据传输传提供通道。socket的主要特点有数据丢失率低,使用简单且易于移植。

玩socket通信要一台手机,建立一个app工程(作为客户端),一个普通java工程(作为服务端)

=====================================================================================================================================================

服务端代码:

public class socketSer {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ServerSocket serverSocket = null;  
        try {  
            // 创建一个ServerSocket对象,并让这个Socket在1989端口监听  
            serverSocket = new ServerSocket(1989);  
            // 调用ServerSocket的accept()方法,接受客户端所发送的请求,  
            // 如果客户端没有发送数据,那么该线程就停滞不继续  
            Socket socket = serverSocket.accept();  
            // 从Socket当中得到InputStream对象  
            InputStream inputStream = socket.getInputStream();  
            byte buffer[] = new byte[1024 * 4];  
            int temp = 0;  
            // 从InputStream当中读取客户端所发送的数据  
            while ((temp = inputStream.read(buffer)) != -1) {  
                System.out.println(new String(buffer, 0, temp));  
            }  
            serverSocket.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }

}

 

1、监听一个端口

2、堵塞在accept方法中,直到有数据传送

3、将socket的输入流显示出来

4、服务器端要创建的是ServerSocket

================================================================================================================================================================

服务端activity:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    public void getButton(View v) {
        new socketThread().start();//建立socket连接这种耗时操作要在子线程中进行
    }
}

class socketThread extends Thread{
    public void run(){
        try {
            //对ip为192.168.1.104的1989端口建立socket连接
            Socket socket=new Socket("192.168.1.104", 1989);
            //在连接的基础上得到输出流
            OutputStream out = socket.getOutputStream();
            String info="asdfghjkl";
            //将字符串转换成byte数组
            byte[] buffer=info.getBytes();
            //信息写入输出流
            out.write(buffer);
            //传送出去
            out.flush();
            System.out.println("发送成功");
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

 

1、布局只有一个按钮,点击即刻发送信息

2、因socket通信时连接网络的耗时操作,所以必须在子线程中运行,否则虚拟机挂掉

3、与一个ip地址的一个端口建立socket通信,再用输出流送出去

 

posted @ 2017-10-01 18:49  sovagxa&静默  阅读(1130)  评论(0编辑  收藏  举报