UDP协议和TCP协议
UDP协议(用户数据报协议): 需要一个发送端和接收端;
发送端:只负责发送数据,不管接收端是否接收到数据.
在传输数据的过程中是允许数据报丢失的;
特点:
1.需要一个发送端和接收端;
2.发送端只负责发送数据,不管接收端是否接收到数据;
3.在传输数据的过程中是允许数据报丢失的;
TCP/IP协议:
特点:
1.需要一个客户端 和 服务器端;
2.不允许出现数据报丢失;
3.使用了三次握手的;
Tcp:
客户端:
1.获得Socket对象
Socket socket=new Socket(address, port);
//参数:address为要连接的电脑ip地址,port为端口
2.然后用socket对象获得i/o流
OutputStream outputStream = socket.getOutputStream();
3.用流写出文件(发送)
outputStream.write(“测试。。。”.getBytes());
4.假如有服务器回执信息
InputStream inputStream = socket.getInputStream();
5.然后读取回执信息
int read = inputStream.read();
6.最后关闭Socket流
socket.close();
public class TCPClient {
public static void main(String[] args) throws Exception {
// 获得客户端对象
Socket socket = new Socket("192.168.145.107", 8888);
// 读取本地文件
BufferedInputStream bufferedInputStream = new BufferedInputStream(
new FileInputStream(
"C:\\Users\\Administrator\\Pictures\\Camera Roll\\xm.jpg"));
// 获得输出流
OutputStream outputStream = socket.getOutputStream();
int cha = -1;
byte[] b = new byte[1024];
while ((cha = bufferedInputStream.read(b)) != -1) {
outputStream.write(b, 0, cha);
}
socket.shutdownOutput();
//服务端返回信息处理
InputStream inputStream = socket.getInputStream();
byte[] c = new byte[1024];
int len = inputStream.read(c);
System.out.println(new String(c, 0, len));
outputStream.close();
socket.close();
System.out.println("发送完毕!");
}
}
服务端:
1.获得ServerSocket对象
ServerSocket serverSocket=new ServerSocket(port);
//此处port必须跟客户端端口保持一致, 不然接收不了数据
2.用ServerSocket对象的accpet()方法,获得Socket对象1
Socket socket = serverSocket.accept();
3.用获得的Socket对象创建读取流,读取客户端Socket发来的消息
InputStream inputStream = accept.getInputStream();
int read = inputStream.read();
4.关闭Socket跟ServerSocket
socket.close();
serverSocket.close();//这个可以不关
public class TCPServer {
public static void main(String[] args) throws Exception {
// 获得服务端对象
ServerSocket serverSocket = new ServerSocket(8888);
// 获得客户端的socket对象
Socket socket = serverSocket.accept();
// 获得socket流
InputStream inputStream = socket.getInputStream();
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
new FileOutputStream("a.jpg"));
byte[] b = new byte[1024];
int len = -1;
while ((len = inputStream.read(b)) != -1) {
bufferedOutputStream.write(b, 0, len);
}
OutputStream outputStream = socket.getOutputStream();
outputStream.write("接收到了,大兄弟!!!".getBytes());
inputStream.close();
socket.close();
}
}
UDP:
发送端:
1.获得DatagramSocket对象
DatagramSocket datagramSocket=new DatagramSocket();
2.创建数据流,获取键盘输入
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
3.循环把输入的内容封装到DatagramPacket数据包对象中
String line=null;
while ((line=bufferedReader.readLine())!=null) {
byte[] b=line.getBytes();
DatagramPacket datagramPacket=new DatagramPacket(b, b.length, InetAddress.getByName(“192.168.145.107”),9001);
datagramSocket.send(datagramPacket);
}
4.关闭Socket流
datagramSocket.close();
public class UDPsent {
public static void main(String[] args) throws Exception {
System.out.println("开始发送!");
// 创建DatagramSocket对象
DatagramSocket datagramSocket = new DatagramSocket();
// 创建读取流,获取键盘录入
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(System.in));
// 循环封装到DatagramPacket数据包中
String line = null;
while ((line = bufferedReader.readLine()) != null) {
byte[] buf = line.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length,
InetAddress.getByName("192.168.145.107"), 9000);
datagramSocket.send(datagramPacket);
}
datagramSocket.close();
}
}
获取端:
1.获得DatagramSocket对象注意要选带端口参数的构造方法
DatagramSocket datagramSocket=new DatagramSocket(9001);
2.创建数据包,并创建DatagramPacket对象,两个参数的。
byte[] bs=new byte[1024];
DatagramPacket datagramPacket=new DatagramPacket(bs, bs.length);
3.用Socket的receive方法获得数据包
datagramSocket.receive(datagramPacket);
4.用datagramPacket解析数据
byte[] data = datagramPacket.getData();
System.out.println(new String(data, 0, data.length));
5.关闭Socket流
datagramSocket.close();
public class UDPget {
public static void main(String[] args) throws Exception {
System.out.println("开始接收!");
// 创建DatagramSocket对象并指定端口号,与发送方端口保持一致
DatagramSocket datagramSocket = new DatagramSocket(9000);
// 创建数据包,创建DatagramPacket对象
byte[] b = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(b, b.length);
// 利用Socket的receive方法接收数据
datagramSocket.receive(datagramPacket);
// 解析数据包
byte[] data = datagramPacket.getData();
int length = datagramPacket.getLength();
System.out.println(new String(data, 0, length));
// 关闭Socket流
datagramSocket.close();
}
}