前言
这篇文章只是简单的介绍Socket
通信,是一篇入门文章。所有还没有接触,但又想了解的可以参考下。希望对你们有所帮助。
Socket
首先一句话简单的介绍Socket
:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket
。
所有我们下面要建立一个服务端与客户端的通信。
嘿嘿,其实上面的那句话是百度百科的,不知道你们发现了没有
服务端
这里我们只要新建了个简单的Java
类,只是实现开启后等到客户端的连接。
实例化ServerSocket
绑定通信端口,最好端口设大点,防止端口被占用
java.net.ServerSocket serverSocket = new java.net.ServerSocket(30000);
等待连接
我们这里设计了死循环,只要开启了就一直等待客户端的连接请求
while (true) {
//接收连接请求
Socket s = serverSocket.accept();
list.add(s);
//为每一个连接开启一个的线程
new Thread(new ServiceRunnable(s)).start();
}
因为我实现的是在多线程下得通信,所有将每个Socket
加入到List
中并且为每一个连接的Socket
开启一个单独的线程。
通信
如何客户端发来的消息,我们就向每一个连接的Socket
发送该消息,所有首先要获取输入流
br = new BufferedReader(new InputStreamReader(s.getInputStream(), "utf-8"));
读取数据
public String readContent() {
try {
return br.readLine();
} catch (IOException e) {
list.remove(s);
e.printStackTrace();
}
return null;
}
获取输出流发送消息
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
地址。
socket = new Socket("192.168.56.1", 30000);
通信
客户端的通信与服务端类似,获取输入流,读取服务器发来的消息,并显示到界面中。
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();
点击发送,获取输出流向服务器发送消息
@Override
public void onClick(View v) {
Message message = new Message();
message.what = 2;
message.obj = et.getText().toString();
clientThread.clientHandler.sendMessage(message);
et.setText("");
}
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/So...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。