JAVA_NET_DEMO

来源:互联网 发布:手机淘宝外卖 编辑:程序博客网 时间:2024/05/21 21:58

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