当前位置:首页 > 开发 > 编程语言 > 网络编程 > 正文

Java--Socket通信(双向)

发表于: 2014-03-01   作者:coach   来源:转载   浏览:
摘要: 新建两个工程,一个客户端,一个服务端,先启动服务端再启动客户端 两个工程的读写操作线程类基本上完全相同 服务端: import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import j
新建两个工程,一个客户端,一个服务端,先启动服务端再启动客户端
两个工程的读写操作线程类基本上完全相同

服务端:
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();
			}
		}
	}
}

Java--Socket通信(双向)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号