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