TCP数据多次传输

/**
 * TcpAsyncServer.java
 */
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.net.*;
import java.util.Iterator;
public class TcpAsyncServer {
	/*监听端口*/
	int port = 8888;
	/*缓冲区大小*/
	ByteBuffer buffer = ByteBuffer.allocate(48);
	/*其它相关定义*/
	Selector selector;
	ServerSocketChannel channel;
	ServerSocket socket;
	//数据的发送到网站
	SendMassage sendMassage=new SendMassage();
	/*启动*/
	public void Start() throws Exception {
		/*初始化一个Selector*/
		selector = Selector.open();
		/*打开通道*/
		channel = ServerSocketChannel.open();
		/*非阻塞模式*/
		channel.configureBlocking(false);
		/*本机IP*/
		//InetAddress ip = InetAddress.getByName("127.0.0.1");
		InetAddress ip = InetAddress.getLocalHost();
		System.out.println(ip.toString());
		/*绑定IP和端口*/
		InetSocketAddress address = new InetSocketAddress(ip,port);
		socket = channel.socket();
		socket.bind(address);
		/*启动监听*/
		System.out.println("TCP服务器开始监听...");
		Listen();
	}

	/*停止*/
	public void Stop() throws Exception {
		channel.close();
		selector.close();
	}

	/*监听*/
	public void Listen() throws Exception {
		/*注册接收事件*/
		channel.register(selector,SelectionKey.OP_ACCEPT);
		/*无限循环*/
		while (true) {
			selector.select();
			/*轮询事件*/
			Iterator iter = selector.selectedKeys().iterator();
			while (iter.hasNext()) {
				SelectionKey key =  (SelectionKey)iter.next();
				iter.remove();
				/*事件分类处理*/
				if (key.isAcceptable()) {
					ServerSocketChannel ssc = (ServerSocketChannel)key.channel();
					SocketChannel sc = ssc.accept();
					sc.configureBlocking(false);
					sc.register(selector, SelectionKey.OP_READ);
					System.out.println("新终端已连接:"+ sc.getRemoteAddress());
				}
				else if (key.isReadable()) {
					SocketChannel sc = (SocketChannel)key.channel();
					int recvCount = sc.read(buffer);
					if (recvCount > 0) {
						byte[] arr = buffer.array();
						System.out.println(sc.getRemoteAddress() + "发来数据: "+ new String(arr));
//						sendMassage.setMassage(new String(arr));
//						sendMassage.send();
						buffer.flip();
					}
					else {
						sc.close();
					}
					buffer.clear();
				}
				else {
				}
			}
		}
	}
}

  主方法

//主方法,
class serverMain {
    public static void main(String[] args) throws Exception {
        TcpAsyncServer tcpServer = new TcpAsyncServer();
        tcpServer.Start();
    }

}

  发送端

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;

/**
 * 发送消息
 *	发送数据 端口10001
 *	接受数据端口10002
 */
public class SendMassage {
	//	发送消息内容,当消息为a时不处理
	private String massage = "";

	public String getMassage() {
		return massage;
	}

	public void setMassage(String massage) {
		this.massage = massage;
	}

	//	建立连接,发送制定消息
	public void send(){
		try {
			if(!massage.equals("") || !massage.equals(null)){
				String i= massage;
				ServerSocket ss = new ServerSocket(10001);
				System.out.println("等待链接");
				Socket socket = ss.accept();
				System.out.println("链接成功"+i);
				OutputStream out = socket.getOutputStream();
				String w = String.valueOf(i);
				out.write(w.getBytes());
				socket.close();
				ss.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
	public static String suiji() {
		int x;
		String y;
		Random r = new Random();
		x=r.nextInt(2);
		switch (x) {
		case 0:
			y="25,44,204,312,0.5,北";
			break;
		case 1:
			y="29,55,215,333,0.45,南";
			break;
		default:
			y ="27,66,256,450,0.4,东";
			break;
		}
		return y;
	}
}

  

时间: 2024-10-08 14:32:41

TCP数据多次传输的相关文章

网络TCp数据的传输设计(黏包处理)

//1.该片为引用别人的文章:http://www.cnblogs.com/alon/archive/2009/04/16/1437599.html 解决TCP网络传输"粘包"问题 解决TCP网络传输"粘包"问题 作者:杨小平 王胜开 原文出处:http://www.ciw.com.cn/ 当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(trans

[转载] tcp数据重传时间细节探秘及数据中心优化

原文: http://weibo.com/p/1001603821691477346388 在数据中心网络内,机器之间数据传输的往返时间(rtt)一般在10ms以内,为此调内部服务的超时时间一般会设置成50ms.200ms.500ms等,如果在传输过程中出现丢包,这样的服务超时时间,tcp层有机会发现并重传一次数据么?如果设置成200ms以内,答案是没有机会,原因是linux系统下第一次重传时间等于传输的往返时间上至少加上200ms的预测偏差值,即如果rtt值是7ms,第一次重传超时时间至少是2

学习笔记之TCP/IP协议的传输方式

一.通过网络发送数据,大致可以分为面向有连接与面向无连接两种类型: 1.面向无连接型包括以太网. IP.UDP等协议. 2. 面向有连接 型包括ATM.帧中继.TCP等 协议. 通过一张图了解一下: 面向有连接型 面向有连接型中,在发送数据之前,需要在收发主机之间连接一条通信线路 面向有连接型就好比人们平常打电话,输入完对方电话号码拨出之后,只有 对端拿起电话才能真正通话,通话结束后将电话机扣上就如同切断电源.因此在 面向有连接的方式下,必须在通信传输前后,专门进行建立和断开连接的处理.如果与对

终端、网络到服务端(一)从日常vps云服务器的管理看数据包的传输

从日常vps云服务器的管理看数据包的传输 无论从app移动端,还是pc设备,总要通过接入,通过网络传输到服务端进行数据握手和各类交互,那么从这个角度出发,就可以看到各种终端设备发出的网络请求,最终还是要特定方式连接上服务端的.以vps服务器管理来说,一般vps idc都提供2种接入方式:远程桌面和web接入: 1 远程接入走的是应用层,发送的是segment段地址信息,通过tcp/ip协议的3次握手建立连接,出现远程桌面的登录界面. 2 web登录,一般都是由idc提供一个web管理界面,在会员

TCP/IP入门(3) --传输层

原文:http://blog.csdn.net/zjf280441589/article/category/1854365 传输层的主要功能 1)传输层为应用进程之间提供端到端的逻辑通信(网络层是为主机到主机提供逻辑通信). 2)复用和分用: 复用是指发送方不同的应用进程都可以使用同一个传输层协议传送数据; 分用是指接收方的传输层在剥去报文的首部之后能够把这些数据正确交付到目的应用进程. 3)传输层还会对收到的报文进行差错检测(首部和数据部分), 而网络层只检查IP数据报的首部, 不检验数据部分

TCP/IP 协议图--传输层中的 TCP 和 UDP

TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP. TCP 是面向连接的.可靠的流协议.流就是指不间断的数据结构,当应用程序采用 TCP 发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端.TCP 为提供可靠性传输,实行"顺序控制"或"重发控制"机制.此外还具备"流控制(流量控制)"."拥塞控制".提高网络利用率等众多功能. UDP 是不具有可靠性的数据报协议.细微的处理它会

TCP协议的可靠传输

一.TCP协议的可靠传输 TCP的可靠传输基于ARQ协议: TCP的滑动窗口以字节为单位: 考虑一种情况:窗口中的数据全部都发送出去了,但是全都没有收到确认号,可用窗口为0,窗口是不能向前推进的. 一种特殊情况:窗口中所有数据都已经发送出去了,但确认号不是按顺序收到的 so:可靠传输的效率不是很高. 选择重传:选择重传需要指定需要重传的字节:每一个字节都有一个唯一的32位序号,选择重传需要指定的就是这个序号:这个指定的字节序号是存储在TCP选项里面的. 选择重传更多时候是对一段字节进行重传的.重

高效的TCP数据拆包器

高效的TCP数据拆包器 接收器,每秒拆1KB的包达到30万以上 /// 数据同步协义数据接收器 /// </summary> /// <remarks> /// 主要功能有 /// 1.将一个TCPSocket的所有数据全部接收 /// 2.解析协义 /// 3.解析完成后的协义调用 Handler通知外部处理 /// 4.定义一个协义解析线程不停的解析协义 /// </remarks> public class TCPReceiver : IDisposable {

JDBC之 大数据内容的传输

JDBC之 大数据内容的传输 什么是大数据内容? 在数据库中,有一条一条的记录,记录中很多字段都是几个字符就够的,假如现在要把一部小说存入数据库,这本小说当然不是几个字符组成,而是由几万字组成,这本小说的数据我们就可以说是大数据,生活中当然有各种各样的大数据:电影,音乐,图片等等... 大字符数据内容操作 大字符内容:通常是指很长的字符类型的文件,例如小说,故事等等,内容有字符组成. 下面说明一下MySQL与Oracle中的大数据类型 数据种类 数据大小 MySQL Oracle 字符 小 ch