软件编程
位置:首页>> 软件编程>> java编程>> Java--Socket通信(客户端服务端双向)

Java--Socket通信(客户端服务端双向)

作者:zlQ_  发布时间:2021-09-21 20:58:37 

标签:java,socket,通信

新建两个工程,一个客户端,一个服务端,先启动服务端再启动客户端

两个工程的读写操作线程类基本上完全相同

服务端:


import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

public static final int PORT = 8000;//监听的端口号  

public static void main(String[] args) {  
   Server server = new Server();  
   server.init();  
 }  

public void init() {  
   ServerSocket serverSocket = null;
   try {  
     serverSocket = new ServerSocket(PORT);  
     while (true) {  
       Socket client = serverSocket.accept();  
       //一个客户端连接就开户两个线程处理读写  
       new Thread(new ReadHandlerThread(client)).start();  
       new Thread(new WriteHandlerThread(client)).start();  
     }  
   } catch (Exception e) {  
     e.printStackTrace();  
   } finally{
     try {
       if(serverSocket != null){
         serverSocket.close();
       }
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
 }  
}  

/*
*处理读操作的线程  
*/
class ReadHandlerThread implements Runnable{
 private Socket client;

public ReadHandlerThread(Socket client) {
   this.client = client;
 }

@Override
 public void run() {
   DataInputStream dis = null;
   try{
     while(true){
       //读取客户端数据  
       dis = new DataInputStream(client.getInputStream());
       String reciver = dis.readUTF();
       System.out.println("客户端发过来的内容:" + reciver);  
     }
   }catch(Exception e){
     e.printStackTrace();
   }finally{
     try {
       if(dis != null){
         dis.close();
       }
       if(client != null){
         client = null;
       }
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
 }
}

/*
* 处理写操作的线程
*/
class WriteHandlerThread implements Runnable{
 private Socket client;

public WriteHandlerThread(Socket client) {
   this.client = client;
 }

@Override
 public void run() {
   DataOutputStream dos = null;
   BufferedReader br = null;
   try{
     while(true){
       //向客户端回复信息  
       dos = new DataOutputStream(client.getOutputStream());  
       System.out.print("请输入:\t");  
       // 键盘录入  
       br = new BufferedReader(new InputStreamReader(System.in));
       String send = br.readLine();  
       //发送数据
       dos.writeUTF(send);  
     }
   }catch(Exception e){
     e.printStackTrace();
   }finally{
     try {
       if(dos != null){
         dos.close();
       }
       if(br != null){
         br.close();
       }
       if(client != null){
         client = null;
       }
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
 }
}

客户端:


import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class Client {

public static final String IP = "localhost";//服务器地址  
 public static final int PORT = 8000;//服务器端口号  

public static void main(String[] args) {  
   handler();  
 }

private static void handler(){
   try {
     //实例化一个Socket,并指定服务器地址和端口
     Socket client = new Socket(IP, PORT);
     //开启两个线程,一个负责读,一个负责写
     new Thread(new ReadHandlerThread(client)).start();
     new Thread(new WriteHandlerThread(client)).start();
   } catch (Exception e) {
     e.printStackTrace();
   }
 }
}  

/*
*处理读操作的线程  
*/
class ReadHandlerThread implements Runnable{
 private Socket client;

public ReadHandlerThread(Socket client) {
   this.client = client;
 }

@Override
 public void run() {
   DataInputStream dis = null;
   try {
     while(true){
       //读取服务器端数据  
       dis = new DataInputStream(client.getInputStream());
       String receive = dis.readUTF();  
       System.out.println("服务器端返回过来的是: " + receive);  
     }
   } catch (IOException e) {
     e.printStackTrace();
   } finally{
     try {
       if(dis != null){
         dis.close();
       }
       if(client != null){
         client = null;
       }
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
 }
}

/*
* 处理写操作的线程
*/
class WriteHandlerThread implements Runnable{
 private Socket client;

public WriteHandlerThread(Socket client) {
   this.client = client;
 }

@Override
 public void run() {
   DataOutputStream dos = null;
   BufferedReader br = null;
   try {
     while(true){
       //取得输出流
       dos = new DataOutputStream(client.getOutputStream());
       System.out.print("请输入: \t");  
       //键盘录入
       br = new BufferedReader(new InputStreamReader(System.in));
       String send = br.readLine();  
       //发送数据
       dos.writeUTF(send);  
     }
   } catch (IOException e) {
     e.printStackTrace();
   } finally{
     try{
       if(dos != null){
         dos.close();
       }
       if(br != null){
         br.close();
       }
       if(client != null){
         client = null;
       }
     }catch(Exception e){
       e.printStackTrace();
     }
   }
 }
}

来源:http://blog.csdn.net/zlqqhs/article/details/8757250

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com