TCP与UDP区别:
1.TCP面向连接,发送数据前要先建立连接;UDP是无连接的,发送数据前不需要建立连接;
2.TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,不保证可靠交付;
3.UDP有较好的实时性,效率比TCP高,适用于对高速传输和实时性较高的通信或广播通信;
4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信;
TCP编程:
1.服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户端到端口的连接请求。
2.客户端程序根据服务器程序所在的主机名和端口发出连接请求。
client发送端:
package client;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class client {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",9999);
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = new FileInputStream("D:\\timg.jpg");
byte[] car = new byte[1024];
int length = 0;
while ((length = inputStream.read(car))!=-1) {
outputStream.write(car,0,length);
}
outputStream.flush();
outputStream.close();
inputStream.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
/*try {
DatagramSocket socket = new DatagramSocket(9999);
byte[] data ="来自客户端的问候".getBytes();
SocketAddress address = new InetSocketAddress("127.0.0.1", 8888);
DatagramPacket packet = new DatagramPacket(data, data.length,address);
socket.send(packet);
socket.close();
} catch (Exception e) {
e.printStackTrace();
*/
}
}
连接到服务器端:
Socket socket = new Socket("127.0.0.1",9999);
获取socket连接的输出对象:
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = new FileInputStream("D:\\timg.jpg");
客户端向服务端发送内容:
while ((length = inputStream.read(car))!=-1) {
outputStream.write(car,0,length);
}
关闭资源:
outputStream.flush();
outputStream.close();
inputStream.close();
socket.close();
server接收端:
package server;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
public class server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(9999);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
byte[] car = new byte[1024];
int length = 0;
OutputStream outputStream = new FileOutputStream("F:\\1111.jpg");
while ((length = inputStream.read())!=-1) {
outputStream.write(car,0,length);
}
outputStream.flush();
outputStream.close();
inputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
/*try {
DatagramSocket socket = new DatagramSocket(8888);
byte[]car =new byte[1024];
DatagramPacket packet = new DatagramPacket(car, car.length);
socket.receive(packet);
packet.getLength();
int length = packet.getLength();
System.out.println(new String(car,0,length));
socket.close();
} catch (Exception e) {
e.printStackTrace();
}*/
}
}
创建服务端套接字:(端口号与客户端保持一致)
ServerSocket serverSocket = new ServerSocket(9999);
监听客户端请求:
Socket socket = serverSocket.accept();
获取socket连接输入对象:
InputStream inputStream = socket.getInputStream();
获取来自客户端的数据:
OutputStream outputStream = new FileOutputStream("F:\\1111.jpg");
while ((length = inputStream.read())!=-1) {
outputStream.write(car,0,length);
}
UDP编程:
UDP是用户数据报协议,基于UDP的Socket编程是一种非连接的Socket通信,它提供的是无连接、不可靠信息传送服务。 DatagramSocket:用来发送和接收数据包的套接字
DatagramPacket :表示数据包
client客户端:
步骤:
1.创建数据Socket,指定一个客户端端口号。
2.提供一个存储了所发送数据的byte数组,提供服务端的IP地址和端口号。
3.调用DatagramPacket的send()方法进行数据的发送;
4.释放资源。
try {
DatagramSocket socket = new DatagramSocket(9999);
byte[] data ="来自客户端的问候".getBytes();
SocketAddress address = new InetSocketAddress("127.0.0.1", 8888);
DatagramPacket packet = new DatagramPacket(data, data.length,address);
socket.send(packet);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
创建数据包套接字:
DatagramSocket socket = new DatagramSocket(9999);
根据主机名和端口号创建套接字地址:(这里可以创建多个IP,发送到多个服务端)
SocketAddress address = new InetSocketAddress("127.0.0.1", 8888);
创建发送的数据包:
DatagramPacket packet = new DatagramPacket(data, data.length,address);
发送数据:
socket.send(packet);
关闭连接:
socket.close();
server服务端:
步骤:
1.创建数据Socket,指定一个服务端端口号。
2.提供一个byte数组用于数据存储。
3.调用DatagramPacket的receive() 方法进行数据的接收;
4.调用DatagramPacket的getData()方法得到byte数组的数据;
5.释放资源。
try {
DatagramSocket socket = new DatagramSocket(8888);
byte[]car =new byte[1024];
DatagramPacket packet = new DatagramPacket(car, car.length);
socket.receive(packet);
packet.getLength();
int length = packet.getLength();
System.out.println(new String(car,0,length));
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
创建数据包套接字:
DatagramSocket socket = new DatagramSocket(8888);
创建接收的数据包:
DatagramPacket packet = new DatagramPacket(car, car.length);
接收数据:
socket.receive(packet);
得到并输出数据:
System.out.println(new String(car,0,length));