码迷,mamicode.com
首页 > 其他好文 > 详细

TCP数据多次传输

时间:2017-08-17 21:38:04      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:cti   etc   循环   key   read   server   大小   else   value   

/**
 * 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;
	}
}

  

TCP数据多次传输

标签:cti   etc   循环   key   read   server   大小   else   value   

原文地址:http://www.cnblogs.com/test1234/p/7384213.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!