JAVA_NET_DEMO

1.      TCP与UDP

TCP(Tranfer Control Protocol):

    面向连接的协议,在进行数据传输之前必然要建立连接,需要连接时间

    TCP传输数据没有大小限制

可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据

 

UDP(User Datagram Protocol):

一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方

    传输数据有大小限制,每个被传输的数据报必须限定在64KB之内

每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接

 

2.      应用

TCP应用需要数据的准确完整性(登录验证等)

UDP应用局域网高可靠性的分散系统中client/server应用程序(并不要求绝对正确.到达)

 

3.      步骤

a)        创建Socket

b)       打开连接到Socket的输入/出流

c)        按照一定的协议对Socket进行读/写操作

d)       关闭Socket

 

4.      CODE

a) TCPSERVER

package com.net;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
	public static void main(String[] args) {
//		testServer();
		testServerMuch();
	}

	public static void testServer() {
		String clientMsg = "";
		try {
			ServerSocket ss = new ServerSocket(Constant.SOCKET_PORT);
			Socket sc = ss.accept();
			System.out.println("客户端连接上!");
			DataInputStream dis = new DataInputStream(sc.getInputStream());
			DataOutputStream dos = new DataOutputStream(sc.getOutputStream());
			while (!"10".equals(clientMsg)) {
				Thread.sleep(3000);
				clientMsg = dis.readUTF();
				System.out.println("客户端说:" + clientMsg);
				dos.writeUTF("服务器已接收到" + clientMsg);
			}
			dos.flush();
			dis.close();
			dos.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public static void testServerMuch() {
		int clientIndex = 1;
		try {
			ServerSocket ss = new ServerSocket(9999);
			while (true) {
				Socket sc = ss.accept();// 接收到请求之后往下执行
				System.out.println("客户端" + clientIndex + "连接上");
				new Thread(new Server(sc, clientIndex)).start();
				clientIndex++;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	class Person{
		
	}
}

class Server implements Runnable {
	private Socket sc;
	private int clientIndex;
	
	public Server(Socket sc,int clientIndex) {
		this.sc = sc;
		this.clientIndex = clientIndex;
	}
	
	@Override
	public void run() {
		try {
			String clientMsg = "";
			DataInputStream dis = new DataInputStream(sc.getInputStream());
			DataOutputStream dos = new DataOutputStream(sc.getOutputStream());
			while (!"10".equals(clientMsg)) {
				Thread.sleep(1000);
				clientMsg = dis.readUTF();// 获取到客户端信息之后继续往下执行
				System.out.println("客户端" + clientIndex + "说:" + clientMsg);
				dos.writeUTF("服务器已接收到" + clientMsg);
				dos.flush();
			}
			dis.close();
			dos.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
}

b) TCPCLIENT

package com.net;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class TCPClient {
	public static void main(String[] args) {
		testClient();
	}
	
	public static void testClient(){
		int i = 0;
		try {
			Socket sc = new Socket(Constant.CLIENT_HOST,Constant.SOCKET_PORT);
			DataOutputStream dos = new DataOutputStream(sc.getOutputStream());
			DataInputStream dis = new DataInputStream(sc.getInputStream());
			while(i<=10){
				Thread.sleep(3000);
				dos.writeUTF("" + i + "");
				dos.flush();
				System.out.println(dis.readUTF());
				i++;
			}
			dos.close();
			dis.close();
			sc.close();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

c) UPDSERVER

package com.net;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPServer {
	public static void main(String[] args) {
		testServer();
	}

	public static void testServer() {
		DatagramSocket ss = null;
		// 设置数据包缓冲区
		byte[] buffer = new byte[1024];
		DatagramPacket inDgp = new DatagramPacket(buffer, buffer.length);

		try {
			ss = new DatagramSocket(Constant.SOCKET_PORT);
			// 接收客户端的数据包
			ss.receive(inDgp);
			// 获取客户端的地址 客户端的端口(由数据包获取)
			InetAddress senderAdd = inDgp.getAddress();
			int senderPort = inDgp.getPort();
			String hostAdd = senderAdd.getHostAddress();
			// 获取数据包中的数据(其中至少有:地址和数据)
			String data = new String(inDgp.getData(), 0, inDgp.getLength());
			String text = "主机号:" + hostAdd + "  数据内容:" + data;
			// 打印数据
			System.out.println(text + "  主机端口:" + senderPort);
			
			// 返回消息给客户端
			DatagramPacket outDgp = new DatagramPacket("服务器已经接收到信息".getBytes(),
					"服务器已经接收到信息".getBytes().length, senderAdd, senderPort);
			ss.send(outDgp);
			ss.close();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		

		
		// 关闭服务端套接字
		ss.close();
		System.out.println("服务端关闭!");
	}
}


d) UDPCLIENT

package com.net;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPClient {
	public static void main(String[] args) {
		byte[] buffer = new byte[1024];
		System.out.println("客户端启动•••");
		try {
			DatagramSocket cs = new DatagramSocket();

			DatagramPacket inDgp = new DatagramPacket(buffer,buffer.length);
			DatagramPacket outDgp = new DatagramPacket("test".getBytes(),
					"test".length(), InetAddress.getLocalHost(),
					Constant.SOCKET_PORT);

			// 发送数据给服务端
			cs.send(outDgp);
			System.out.println("客户端发送数据完成...");
			// 服务器返回信息
			cs.receive(inDgp);
			System.out.println("服务器返回信息为:" + new String(inDgp.getData(),0,inDgp.getData().length));
			// 关闭服务端套接字
			cs.close();
			System.out.println("客户端关闭...");
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值