1 前言
在java中,网络通信一般都是用socket的,下面是一个简单的socket通信的例子
2 socket通信实战
先来看服务端
/**
* @author Created by qiyei2015 on 2018/1/5.
* @version: 1.0
* @email: 1273482124@qq.com
* @description:
*/
public class SocketServer {
public static void main(String[] args){
new SocketServer().start();
}
public void start(){
ServerSocket serverSocket = null;
Socket socket = null;
try {
serverSocket = new ServerSocket(8888);
while (true){
socket = serverSocket.accept();
newSocketRun(socket);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 开启一个新socket来运行
* @param socket
*/
public void newSocketRun(final Socket socket){
new Thread(new Runnable() {
public void run() {
BufferedReader inputReader = null;
BufferedWriter outputWirter = null;
System.out.println("client:" + socket.hashCode() + " connected ! ");
try {
inputReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
outputWirter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String s = null;
while (!(s = inputReader.readLine()).equals("bye")){
System.out.println("receive:" + s);
outputWirter.write("server reply :" + s + "\n");
outputWirter.flush();
System.out.println("send:" + s);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
inputReader.close();
outputWirter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
可以看到,服务端主要创建一个ServerSocket,并制定端口号,然后调用serverSocket.accept();等待客户端的连接,如果没有连接会阻塞在这,连接成功后会返回一个Socket对象,然后操作这个Socket的流就可以了。
为了支持多个客户端连接,这里每连接成功一个客户端,都创建一个线程来处理
下面来看客户端代码
/**
* @author Created by qiyei2015 on 2018/1/5.
* @version: 1.0
* @email: 1273482124@qq.com
* @description:
*/
public class SocketClient {
public static void main(String[] args){
new SocketClient().start();
}
public void start(){
BufferedReader inputReader = null;
BufferedReader bufferedReader = null;
BufferedWriter outputWriter = null;
Socket socket = null;
try {
socket = new Socket("127.0.0.1",8888);
outputWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
inputReader = new BufferedReader(new InputStreamReader(System.in));
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s = null;
while (!(s = inputReader.readLine()).equals("bye")){
//需要加结束符 \n
outputWriter.write(s + "\n");
outputWriter.flush();
System.out.println("receive server:" + bufferedReader.readLine());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
inputReader.close();
bufferedReader.close();
outputWriter.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端的代码也比较简单,主要就是创建Socket对象,并指定ip和端口号
然后和客户端一样,操作socket对象的流即可完成数据的收发
运行效果如下:
服务端:
客户端:
程序很简单,也就不贴出来了