盒子
盒子
文章目录
  1. 前言
    1. Socket
    2. 服务端
      1. 实例化ServerSocket
      2. 等待连接
      3. 通信
    3. 客户端
      1. 建立连接
      2. 通信
    4. 总结

Socket的简单通信

前言

这篇文章只是简单的介绍Socket通信,是一篇入门文章。所有还没有接触,但又想了解的可以参考下。希望对你们有所帮助。

Socket

首先一句话简单的介绍Socket:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket
所有我们下面要建立一个服务端与客户端的通信。

嘿嘿,其实上面的那句话是百度百科的,不知道你们发现了没有

服务端

这里我们只要新建了个简单的Java类,只是实现开启后等到客户端的连接。

实例化ServerSocket

绑定通信端口,最好端口设大点,防止端口被占用

1
java.net.ServerSocket serverSocket = new java.net.ServerSocket(30000);

等待连接

我们这里设计了死循环,只要开启了就一直等待客户端的连接请求

1
2
3
4
5
6
7
while (true) {
//接收连接请求
Socket s = serverSocket.accept();
list.add(s);
//为每一个连接开启一个的线程
new Thread(new ServiceRunnable(s)).start();
}

因为我实现的是在多线程下得通信,所有将每个Socket加入到List中并且为每一个连接的Socket开启一个单独的线程。

通信

如何客户端发来的消息,我们就向每一个连接的Socket发送该消息,所有首先要获取输入流

1
br = new BufferedReader(new InputStreamReader(s.getInputStream(), "utf-8"));

读取数据

1
2
3
4
5
6
7
8
9
public String readContent() {
try {
return br.readLine();
} catch (IOException e) {
list.remove(s);
e.printStackTrace();
}
return null;
}

获取输出流发送消息

1
2
3
4
5
6
7
8
9
10
11
12
13
while ((content = readContent()) != null) {
//遍历所有连接了的Socket,向所有客户端Socket发送消息
for (Iterator<Socket> it = list.iterator(); it.hasNext(); ) {
Socket socket = it.next();
try {
pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
pw.println(content);
} catch (IOException e) {
it.remove();
e.printStackTrace();
}
}
}

服务端这样就可以了,下面是客户端

客户端

客户端布局只要实现一个简单的发送界面,这里就不多说了。直接说Socket

建立连接

指定服务主机名或IP地址与连接的端口号,应为是本地服务器所有这里直接使用本地IP地址。

1
socket = new Socket("192.168.56.1", 30000);

通信

客户端的通信与服务端类似,获取输入流,读取服务器发来的消息,并显示到界面中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

new Thread(new Runnable() {
String line;

@Override
public void run() {
try {
//读取服务端发来的消息
while ((line = br.readLine()) != null) {
Message message = new Message();
message.what = 1;
message.obj = line;
handler.sendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();

点击发送,获取输出流向服务器发送消息

1
2
3
4
5
6
7
8
@Override
public void onClick(View v) {
Message message = new Message();
message.what = 2;
message.obj = et.getText().toString();
clientThread.clientHandler.sendMessage(message);
et.setText("");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
clientHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
if (msg.what == 2) {
try {
//向服务端发送消息
pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
pw.println(msg.obj);
} catch (IOException e) {
e.printStackTrace();
}
}
}
};

到此整个的Socket通信就基本上完成了。

总结

通过上面的示例使用Socket实现通信,主要分为三步

  • 实例化Socket,建立连接
  • 获取输入流,读取数据
  • 获取输出流,发送数据

当然这只是一个简单的例子,带领我们入门而已。有兴趣的可以借助下面的Demo学习。

Demo地址:https://github.com/idisfkj/Socket

转载请指明出处 idisfkj博客:https://idisfkj.github.io

支持一下
赞赏是一门艺术