//服务端程序
package com.socket.server;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SockServer {
public static void main(String[] args) {
SockServer socketServer = new SockServer();
socketServer.startServer();
}
public void startServer() {
ServerSocket serverSocket = null; //注意代码规范
Socket socket = null;
try {
serverSocket = new ServerSocket(9999); //创建socket实例,端口为9999
System.out.println("server started..");//创建成功后输出创建成功
while (true) {
socket = serverSocket.accept(); //while无限循环来等待客户端接入
manageConnection(socket); //serversocket用来等待客户端接入,返回一个socket实例,用来操作socket里面的数据
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
socket.close(); //操作后关闭socket
serverSocket.close();//操作后关闭serversocket
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void manageConnection(final Socket socket) { //匿名类使用传参数只能传入final或者全局变量
new Thread(new Runnable() {
@Override
public void run() {
BufferedReader reader = null; //读取socket里面的数据
BufferedWriter writer =null; //向socket里面写入数据
try {
System.out.println("client " + socket.hashCode() + " connedted");
reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); //getInputStream返回一个字符流
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //getInputStream返回一个输入流
String receivedMsg;
while ((receivedMsg = reader.readLine()) != null) {//读取socket数据
System.out.println("client " + socket.hashCode() + ": " + receivedMsg);
writer.write("server reply: " + receivedMsg + "\n");
writer.flush(); //在客户端接收时,注意发送时加换行符,接收是以换行为结束标志
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
//客户端程序
package com.socket.client;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class SocketClient {
public static void main(String[] args) {
SocketClient client = new SocketClient();
client.start();
}
public void start() {
BufferedReader inputReader = null;
BufferedReader reader = null;
BufferedWriter writer = null;
Socket socket = null;
try {
socket = new Socket("127.0.0.1", 9898);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
inputReader = new BufferedReader(new InputStreamReader(System.in));//监听键盘输入内容
startServerReplyListener(reader);
String inputContent;
int count = 0;
while (!(inputContent = inputReader.readLine()).equals("bye")) {
writer.write(inputContent);
if (count % 2 ==0) {
writer.write("\n");
}
count++;
writer.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
reader.close();
writer.close();
inputReader.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void startServerReplyListener(final BufferedReader reader) {
new Thread(new Runnable() {
@Override
public void run() {
try {
String response;
while ((response = reader.readLine()) != null) {
System.out.println(response);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}