服务端:
- 创建一个 ServerSocket 对象,绑定主机端口号
- 通过 accept() 方法监听所有客户端请求
- 连接建立后,保存当前连接对象的socket信息
- 给指定的socket的对象发送信息
- 连接关闭
客户端:
- 创建Socket对象,指明需要连接的服务器的 IP 和 port
- 连接建立后,通过输出流 socket.getOutputStream()发送请求信息
- 通过输入流获取获取服务端 socket.getInputStream()的响应信息
- 关闭连接
代码实现
- 创建全局工具类以及对象 GlobalCommonUtil
- 创建 socket 线程类集成 Thread 接口,重写run()方法
- 创建客户端模拟类,和 线程启动类
GlobalCommonUtil.java 实现
package com.table.ui.common;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import com.table.ui.object.FileObject;
import com.table.ui.object.TcpObject;
public class GlobalCommonUtil {
public static List<TcpObject> list = new LinkedList<TcpObject>();
public static Map<String,Socket> map = new HashMap<String,Socket>();
}
SocketThread.java 代码实现
package com.table.ui.thread;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import com.table.ui.server.Esp30TcpServer;
public class SocketThread extends Thread{
ServerSocket server;
Socket client;
BufferedReader reader;
public SocketThread(Socket socket){
this.client = socket;
}
@Override
public void run() {
try {
reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
boolean flag = true;
while(flag) {
//此处接收的数据格式为> xxxxx,xxxx,xxxx
String line = reader.readLine();
try {
String[] array = line.split(",");
switch (array[0]) {
case "login":
GlobalCommonUtil.map.put(array[1], client);
break;
case "data":
System.out.println("data。。。");
break;
default:
break;
}
} catch (Exception e) {
e.printStackTrace();
System.err.println("数据上传格式错误");
}
}
} catch (Exception e) {
System.out.println("远程客户端已关闭连接!");
}
}
}
TcpServer启动类
package com.table.ui.thread;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public void start() {
try {
//记录链接过的客户端个数
int count=0;
//1、创建一个服务器端Socket,即ServerSocket,绑定指定的端口,进行监听
ServerSocket serverSocket = new ServerSocket(9000);
System.out.println("服务器即将启动,等待客户端连接");
//2、循环监听等待客户端的连接
while(true){
//调用accept方法 等待客户端的连接
Socket socket = serverSocket.accept();
//创建一个新的线程
SocketThread serverThread = new SocketThread(socket);
//启动线程
serverThread.start();
count++;
System.out.println("连接过的客户端数量为:"+count);
}
// serverSocket.close();//这是一个死循环 所以执行不到这里 服务器会一直运行
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
TcpClient.java 代码实现
package com.table.ui.object;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class TcpClient {
public static void main(String[] args) throws Exception{
Socket client = new Socket("127.0.0.1", 9000);
try {
PrintWriter output = new PrintWriter(client.getOutputStream(), true);
Scanner cin = new Scanner(System.in);
String words;
while (cin.hasNext()) {
words = cin.nextLine();
output.println(words);
System.out.println("写出了数据:" + words);
}
cin.close();
} finally {
client.close();
}
}
}
遍历map集合 根据key 找到socket对象发送信息
public void sendData(){
if(GlobalCommonUtil.map.size()!=0) {
for (Map.Entry<String, Socket> object : GlobalCommonUtil.map.entrySet()) {
Socket client = object.getValue();
try {
bufferedWriter = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
bufferedWriter.write("Start");
bufferedWriter.flush();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}else {
System.out.println("请先登录");
}
}