Java基础Socket的使用方法具体代码
基于TCP协议的Socket使用,模拟客户端发送数据,服务端接受数据
@Test
public void client() throws IOException {
//创建socket对象,指明服务器的ip和端口号
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
Socket socket = new Socket(inetAddress,8899);
//获取一个输出流,用于输出数据
OutputStream outputStream = socket.getOutputStream();
//写出数据
outputStream.write("我是客户端大姐".getBytes());
//资源的关闭
outputStream.close();
socket.close();
}
@Test
public void server() throws IOException {
//创建serverSocket,指明自己的端口号
ServerSocket serverSocket = new ServerSocket(8899);
//调用accept()方法表示接受来自客户端的socket
Socket socket = serverSocket.accept();
//读入收入流的数据
InputStream inputStream = socket.getInputStream();
//不建议这么写(会导致数据丢失)
// byte[] bytes = new byte[5];
// int len;
// while((len = inputStream.read(bytes)) != -1) {
// String str = new String(bytes,0,len);
// System.out.println(str);
// }
//建议这么写
ByteArrayOutputStream byteArrayInputStream = new ByteArrayOutputStream();
byte[] bytes = new byte[10];
int len;
while ((len = inputStream.read(bytes)) != -1){
byteArrayInputStream.write(bytes,0,len);
}
System.out.println(byteArrayInputStream.toString());
//关闭资源
byteArrayInputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
服务端接受到图片之后给客户端一个反馈
@Test
public void client() throws IOException {
//创建socket对象,指明服务器的ip和端口号
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
Socket socket = new Socket(inetAddress,8899);
//获取一个输出流,用于输出数据
OutputStream outputStream = socket.getOutputStream();
//写出数据
File file = new File("三刀流索隆.jpg");
FileInputStream fileInputStream = new FileInputStream(file);
byte[] buffer = new byte[20];
int len;
while((len = fileInputStream.read(buffer))!= -1){
outputStream.write(buffer,0,len);
}
//关闭数据的输出
socket.shutdownOutput();
//客户端发送完数据,等待服务端相应,把消息相应到控制台。
InputStream inputStream = socket.getInputStream();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
while((len = inputStream.read(buffer)) != -1){
byteArrayOutputStream.write(buffer,0,len);
}
System.out.println(byteArrayOutputStream.toString());
//资源的关闭
inputStream.close();
byteArrayOutputStream.close();
outputStream.close();
socket.close();
}
@Test
public void server() throws IOException {
//创建serverSocket,指明自己的端口号
ServerSocket serverSocket = new ServerSocket(8899);
//调用accept()方法表示接受来自客户端的socket
Socket socket = serverSocket.accept();
//读入收入流的数据
InputStream inputStream = socket.getInputStream();
File file = new File("另一个三刀流索隆.jpg");
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] buffer = new byte[20];
int len;
while ((len = inputStream.read(buffer)) != -1){
fileOutputStream.write(buffer,0,len);
}
System.out.println("服务器接受到图片");
//服务端接受到数据之后给客户端一个反馈
OutputStream outputStream = socket.getOutputStream();
outputStream.write("服务端已经接受到来自客户端的数据!".getBytes());
//关闭资源
fileOutputStream.close();
outputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
- 客户端发送完数据需要执行如下代码,告诉服务端我发送完全部数据了。
socket.shutdownOutput(); - 需要先启动服务端,在启动客户端。因为TCP协议是一种需要通过三次握手来建立可靠连接的通信协议。
- 为什么是三次,不是一次不是两次也不是更多次数呢?
原因是一次两次无法建立可靠的连接,再多次数对连接可靠性的提升也仅仅是微乎其微的,反而因为建立连接而消耗了过多的资源。
TCP的连接过程可以类比为:
客户端:我是张三,你是谁?
服务端:我知道你是张三了,我是李四。
客户端:我知道你知道我是张三,你是李四了。
相比之下,TCP协议是确保数据尽可能的传输完整,UDP是不可靠的连接方式,但是UDP协议并非没有用武之地,比如网络视频的传输,要尽可能的保证视频的流畅,偶尔的丢帧是可以接受的,一般的垃圾短信的炮轰也是基于UDP协议的。
webSocket与socket区别
https://www.cnblogs.com/Javi/p/9303020.html
基于UDP的Socket使用
@Test
public void client() throws IOException {
DatagramSocket datagramSocket = new DatagramSocket();
String str = "这是基于UPD协议发送的文字";
byte[] data = str.getBytes();
InetAddress localHost = InetAddress.getLocalHost();
DatagramPacket datagramPacket = new DatagramPacket(data, 0, data.length, localHost, 9000);
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
@Test
public void server() throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(9000);
byte[] buffer = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buffer,0,buffer.length);
datagramSocket.receive(datagramPacket);
System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
}
- 这里可以先启动客户端在启动服务端,并不会报错,因为UDP是一种不需要建立可靠连接的协议。