关于Socket编程的处理流程
流程图如下:
文字解析:
服务器会不停监听客户端,直到客户端发送请求后,服务器会根据请求进行处理,并返回数据给客户机。
注意:
1)服务器在监听到客户机的请求后,处理请求通常应采用创建一个线程来处理,这样服务器能处理多个请求,不会发生阻塞。
2)所谓的请求也不过是一组数据,服务器要根据请求数据来判断怎么处理这些数据。
简单的Socket编程代码
服务器:
public class SocketServer {
public static void main(String[] args) {
try {
// 创建服务端socket
ServerSocket serverSocket = new ServerSocket(8088);
// 创建客户端socket
Socket socket = new Socket();
//循环监听等待客户端的连接
while(true){
// 监听客户端
socket = serverSocket.accept();
//创建一个处理请求的线程
ServerThread thread = new ServerThread(socket);
//开启线程
thread.start();
InetAddress address=socket.getInetAddress();
System.out.println("当前客户端的IP:"+address.getHostAddress());
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
服务器处理线程:
public class ServerThread extends Thread{
private Socket socket = null;
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
InputStream is=null;
InputStreamReader isr=null;
BufferedReader br=null;
OutputStream os=null;
PrintWriter pw=null;
try {
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String info = null;
while((info=br.readLine())!=null){
System.out.println("我是服务器,客户端说:"+info);
}
socket.shutdownInput();
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("服务器欢迎你");
pw.flush();
} catch (Exception e) {
// TODO: handle exception
} finally{
//关闭资源
try {
if(pw!=null)
pw.close();
if(os!=null)
os.close();
if(br!=null)
br.close();
if(isr!=null)
isr.close();
if(is!=null)
is.close();
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户机:
public class SocketClient { public static void main(String[] args) throws InterruptedException { try { // 和服务器创建连接 Socket socket = new Socket("localhost",8088); // 要发送给服务器的信息 OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter(os); pw.write("客户端发送信息"); pw.flush(); socket.shutdownOutput(); // 从服务器接收的信息 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String info = null; while((info = br.readLine())!=null){ System.out.println("我是客户端,服务器返回信息:"+info); } br.close(); is.close(); os.close(); pw.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } } }
在编程中遇到的问题:
1)在使用PrintWriter输出数据时,一定要使用 flush() 刷新缓冲,因为PringWriter会将数据存在缓冲区,不刷新数据不会发送出去。
2)输入流和输出流不能同时创建,必须关闭一个才能打开另一个。