用socket模拟实现全双工通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用socket模拟实现全双工通信相关的知识,希望对你有一定的参考价值。

//源码下载 http://download.csdn.net/detail/qq_24054661/9802994
package com.tsocket.test;

import java.io.*;
import java.net.*;

public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket = new Socket("169.254.87.76",8888);
		
		new Thread(new Send(socket)).start();
		new Thread(new Receive(socket)).start();
		/*String info = "客户端要连接!";
		BufferedWriter br = new BufferedWriter(
				new OutputStreamWriter(
						socket.getOutputStream()));
		br.write(info);
		br.newLine();
		br.flush();*/
	}
}
package com.tsocket.test;

import java.io.*;
import java.net.*;

public class Server {
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(8888);
		Socket socket = server.accept();
		new Thread(new Send(socket)).start();
		new Thread(new Receive(socket)).start();
		//new Server().start();
		/*
		Socket socket = server.accept();
		DataInputStream dis = new DataInputStream(socket.getInputStream());
		DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
		while(true){	
			String info = dis.readUTF();
			System.out.println("服务器-->"+info);
			dos.writeUTF("服务器:--->"+info);
		}*/
		
	}
	public void start() throws IOException
	{
		ServerSocket server = new ServerSocket(8888);
		while(true)
		{
			Socket socket = server.accept();
			MyChannel channel = new MyChannel(socket);
			new Thread(channel).start();
		}
	}
	private class MyChannel implements Runnable
	{
		private BufferedReader br ;
		private DataInputStream dis;
		private DataOutputStream dos;
		private boolean isRunning = true;
		private String Msg = null;
		@Override
		public void run() {
			while(isRunning)
			{
				Receive();
				Send();
			}
		}
		private String getMsg()
		{
			try {
				return br.readLine();
			} catch (IOException e) {
				return null;
			}
		}
		public MyChannel (Socket socket)
		{
			br = new BufferedReader(new InputStreamReader(System.in));
			try {
				dis = new DataInputStream(socket.getInputStream());
				dos = new DataOutputStream(socket.getOutputStream());
			} catch (IOException e) {
				CloseUtil.closeAll(dis,dos);
				 isRunning = false;
			}	
		}
		private String Receive()
		{
			try{
				Msg = dis.readUTF();
				
			}catch(Exception e)
			{
				CloseUtil.closeAll(dis,dos);
				isRunning = false;
			}
			return Msg;
		}
		private void Send()
		{
			String Msg=null;
			try {
				Msg = br.readLine();
			} catch (IOException e1) {
				//e1.printStackTrace();
			}
			if(Msg==null||Msg.equals("")){
				return;
			}
			try{
				dos.writeUTF(Msg);
				dos.flush();
			}catch(Exception e){
				CloseUtil.closeAll(dis,dos);
				isRunning = false;
			}
		}
	}

}





package com.tsocket.test;

import java.io.*;
import java.net.*;

public class Receive implements Runnable {
	private boolean isRunning = true;
	private DataInputStream dis;
	public Receive(Socket s)
	{
		try {
			dis = new DataInputStream(s.getInputStream());			
		} catch (IOException e) {
			isRunning = false;
			CloseUtil.closeAll(dis);			
		}
	}
	public String receive()
	{
		String Msg="";
		try {
			Msg=dis.readUTF();
		} catch (IOException e) {
			isRunning = false;
			CloseUtil.closeAll(dis);	
		}
		return Msg;
	}
	@Override
	public void run() {
		while(isRunning)
		{
			System.out.println(receive());
		}
	}

}

 

package com.tsocket.test;

import java.io.Closeable;

public class CloseUtil {
public static void closeAll(Closeable...io)
{
	for(Closeable temp :io)
	{
		try{
			if(null!=temp)
			{
				temp.close();
			}
		}catch(Exception e)
		{
			e.printStackTrace();
		}
	}
		
}
}

 

package com.tsocket.test;

import java.io.*;
import java.net.*;

public class Send implements Runnable {

	private BufferedReader br ;
	private DataOutputStream dos;
	private boolean isRunning = true;
	
	public Send(Socket socket)
	{
		br = new BufferedReader(new InputStreamReader(System.in));
		try {
			dos = new DataOutputStream(socket.getOutputStream());
		} catch (IOException e) {
			isRunning = false;
			CloseUtil.closeAll(dos,br);
		}	
	}
	private String getMsg()
	{
		try {
			return br.readLine();
		} catch (IOException e) {
			return null;
		}
	}
	public void send()
	{
		String Msg = getMsg();
		if(Msg!=null&&!Msg.equals(""))
		{
			try {
				dos.writeUTF(Msg);
				dos.flush();
			} catch (IOException e) {
				isRunning = false;
				CloseUtil.closeAll(dos,br);
			}
		}

	}
	@Override
	public void run() {
		
		while(isRunning)
		{
			send();
		}

	}
	
	
	
	
	

}

 

以上是关于用socket模拟实现全双工通信的主要内容,如果未能解决你的问题,请参考以下文章

数据通信基础(物理层)学习笔记

51单片机串口通讯

udp实现网络通信

java利用socket通信模拟实现ARQ停止等待协议

Python实现多用户全双工聊天(一对一)

node模拟socket