用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();
		}

	}

}
时间: 2024-10-12 03:56:42

用socket模拟实现全双工通信的相关文章

java socket实现全双工通信

大家在登录网站的时候,大部分时候是通过一个表单提交登录信息.但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用HTTP基本认证.下面来看看一看这个认证的工作过程:第一步:  客户端发送http request 给服务器,服务器验证该用户是否已经登录验证过了,如果没有的话,服务器会返回一个401 Unauthozied给客户端,并且在Response 的 header "WWW-Authenticate" 中添加信息.如下图.第二步:浏览器在接受到401 Unauthozie

C# Socket 模拟http服务器帮助类

0x01 写在前面 0x02 Http协议 0x03 TCP/IP 0x04 看代码 0x05 总结 0x01 写在前面 由于工作中,经常需要在服务器之间,或者进程之间进行通信,分配任务等.用Socket操作,太麻烦了,需要建立连接,处理消息.所以 准备创建一个Socket模拟Http服务器的帮助类,来直接通过WebClient进行调用. 0x02 Http协议 我的理解:http协议,其实就是依托于tcp/ip的一个协议,也是可以通过socket发送消息,只是说.发送的内容格式满足http的条

客户端和服务器实现全双工通信(基于线程)

http://blog.sina.com.cn/s/blog_87766e4a0100yp7a.html 1. 基于多线程实现一个服务器和一个客户端实现全双工通信 服务器端创建两个线程:一个用于接收客户端发送过来的信息:一个用来给客户端发送信息. 客户端也创建两个线程:一个用于接收服务器端发送过来的信息:一个用来给服务器端发送信息.   2. 示例代码 服务器端的代码client.c #include <sys/types.h> #include <sys/socket.h> #i

PHP+SOCKET 模拟HTTP请求

HTTP消息结构 客户端请求包括四部份:请求行(状态行).请求头.空行.请求主体(数据),如下图: 服务端响应包括四部份:响应行(状态行).响应头.空行.响应主体(数据),如图: HTTP请求方法: POST .GET  .HEADE.  PUT.  TRACE  .DELETE .OPTIONS .CONNECT  (前三种最实用),有这麽多的请求方法,但web服务器不一定所有的都支持. GET   基本一致,请求指定的页面信息,并返回实体主体. HEAD  基本和GET一致 ,只不过返回的响

C语言 linux环境基于socket的简易即时通信程序

转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html   By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易的C/S即时通信程序,代码如下: head.h 1 /*头文件,client和server编译时都需要使用*/ 2 #include <unistd.h> 3 #include <stdio.h> 4 #include <sys/types.h> 5 #include <sys

android使用socket进行本地PC通信

一.编写思路 手机端为客户端,PC为服务端,手机访问PC通信,需建立一个虚拟的通信链路,客户端通过socket发送请求到服务端,服务端通过serversocket监听来自客户端的socket请求,并生成一个socket.这样就建立了一条虚拟通信网络,然后再通过相关方法进行通信.项目需在服务端建立一个java程序,客户端建立一个android程序. 二.代码编写 (一) PC端的代码编写--java程序 (1)相关方法 Socket accept() :如果接收到一个来自客户端的socket的连接

AF_UNIX域通信(基于socket和pipe的通信,只适于UNIX系统S&C同在一个主机上,用于进程通信)

服务器端: #include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include <sys/socket.h>#include <sys/un.h>#include <stddef.h>char buf[100];void main

wcf中的使用全双工通信(转)

wcf中的使用全双工通信 wcf中的契约通信默认是请求恢复的方式,当客户端发出请求后,一直到服务端回复时,才可以继续执行下面的代码. 除了使用请求应答方式的通信外,还可以使用全双工.下面给出例子: 1.添加一个wcf类库 2.在服务契约添加如下一个片段 [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode = SessionMode.Required,         Call

Python socket模拟HTTP请求

0x00 起 最近在做一个对时间要求比较高的扫描器,需要封装一下SOCKET模拟HTTP发包的一些常用函数.简单的说,就是重写一下requests中的get.post方法. 今天在写的时候,遇到一枚很奇怪的问题,对同一个URL,POST请求能正常返回信息,而一旦切到GET,socket time out. 伪代码如下: get_str = 'GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64)