socket编程记录
前段时间写安卓项目时候,碰到了多设备向后台项目通过socket编程发送数据的问题,于是记下Socket编程的常见套路。
1. 最简单的基于TCP协议的Socket通信demo
- 服务端
//1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket = newServerSocket(10086);//1024-65535的某个端口
//2、调用accept()方法开始监听,等待客户端的连接
Socket socket = serverSocket.accept();
//3、获取输入流,并读取客户端信息
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
String info =null;
while((info=br.readLine())!=null){
System.out.println("我是服务器,客户端说:"+info);
}
socket.shutdownInput();//关闭输入流
//4、获取输出流,响应客户端的请求
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("欢迎您!");
pw.flush();
//5、关闭资源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
- 客户端
//1、创建客户端Socket,指定服务器地址和端口
Socket socket = newSocket("localhost",10086);
//2、获取输出流,向服务器端发送信息
OutputStream os = socket.getOutputStream();//字节输出流
PrintWriter pw =newPrintWriter(os);//将输出流包装成打印流
pw.write("用户名:admin;密码:123");
pw.flush();
socket.shutdownOutput();
//3、获取输入流,并读取服务器端的响应信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while((info=br.readLine())!null){
System.out.println("我是客户端,服务器说:"+info);
}
//4、关闭资源
br.close();
is.close();
pw.close();
os.close();
socket.close();
需要注意的是,这样的代码只能够提供单个客户端的连接,无法处理并发连接的客户端情况。
2. 服务端需处理多个客户端的连接操作时
- 服务端
/**
* 自定义的处理服务端连接的线程类
*/
public class ServerThread extends Thread {
//服务器线程处理
//和本线程相关的socket
Socket client =null; //每个线程类保留一个客户端的socket引用
boolean flag = true;
public ServerThread(Socket socket){
this.client = socket;
}
public void run(){
//服务器接收并处理客户端发送来的信息
try {
BufferedReader input =
new BufferedReader(new InputStreamReader(client.getInputStream()));
int count = 1;
while (flag) {
String line = input.readLine();
if(null != line) {
System.out.println("客户端说: " + line);
if ("exit".equals(line)) flag = false;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
//服务器代码
try {
ServerSocket serverSocket = new ServerSocket(10086);
Socket socket = null;
int count =0;//记录客户端的数量
while(true){
socket = serverSocket.accept();
ServerThread serverThread = new ServerThread(socket);
serverThread.start();
count++;
System.out.println("客户端连接的数量:"+count);
}
} catch (IOException e) {
e.printStackTrace();
}
}
- 客户端
try {
Socket client = new Socket("your ServerSocket ip address", 10086);
PrintWriter output =
new PrintWriter(client.getOutputStream(), true);
String words = dateFormat.format(new Date()) + tagList.toString();
//tagList.size();
output.println(words);
output.flush();
client.shutdownInput();
output.close();
client.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
可以看到,同时需要处理多个客户端时,是在服务端,通过起serversocket来不断获取客户端socket,然后分给每个线程单独去处理子socket,如获取消息,发送信息等。