13.1基于TCP的Socket网络通信及Demo

目录

一、服务器端

二、客户端

三、遇到连接不上的问题解决办法

四、加入等待超时处理


一、服务器端

        在PC上运行,仅仅建立ServerSocket监听,并使用Socket获取输出流输出。该ServerSocket将会一直监听,等待客户端程序的连接。

//基于TCP的Socket网络通信例程 服务器端
public class SimpleServer {
	public static void main(String[] args) throws IOException{

		{
			//创建一个ServerSocket,用于监听客户端Socketde连接请求
			ServerSocket ss = new ServerSocket(30050);
			//采用循环不断的接收来自客户端的请求
			while(true){
				//每当接收到客户端Socket的请求,服务器端也对应产生一个Socket
				Socket s = ss.accept();
				OutputStream os = (OutputStream) s.getOutputStream();
				os.write("您好,您收到了服务器的消息!\n".getBytes("utf-8"));
				//关闭输出流,关闭Socket
				os.close();
				s.close();
			}
		}
	}
}

         接下来的代码用于打开Socket对应的输出流,并向输出流中写入一段字符串数据。这里强行 指定使用UTF-8字符集进行编码,可以避免乱码。

二、客户端

          仅仅使用Socket建立与指定IP地址、指定端口的连接,并使用Socket获取输入流。

/**
* 基于TCP的Socket网络通信例程 Android端
*@author dahaiChang
*created at 2019/8/16 10:45
*/
public class MainActivity extends Activity {
    private TextView show;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show = findViewById(R.id.show);
        new Thread(){
            @Override
            public void run() {
                super.run();
                try {
                    //建立连接到远程服务器的Socket
                    Socket socket = new Socket("192.168.1.128", 30050);
                    //加入10s超时及处理
                    socket.setSoTimeout(1000);
                    //将Sockt对应的输入流包装成BufferReader
                    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    //进行普通IO操作
                    String line = br.readLine();
                    show.setText("来自服务器的数据:" + line);
                } catch (SocketException e) {
                    e.printStackTrace();
                    Log.e(TAG,"请求超时");
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }


            }
        }.start();
    }
}

     由于建立网络连接和 通信是不稳定的,所需时间也不确定,因此需要在子线程中完成网络连接。因此在配置文件中添加网络权限。

<uses-permission android:name="android.permission.INTERNET"/>

三、遇到连接不上的问题解决办法

       1、客户端与服务器端要处于同一个局域网中

       2、PC端的防火墙要关闭

四、加入等待超时处理

        在实际应用中,程序可能不想让执行网络连接、读取服务器数据的进程一直阻塞,要加入等待 超时处理。

                    //加入10s超时及处理
                    socket.setSoTimeout(1000);

  Demo下载链接:https://github.com/dahaiChang/SocketClient

猜你喜欢

转载自blog.csdn.net/u010194538/article/details/99672931
今日推荐