
一、Socket套接字
- 网络上的两个程序通过一个双向的通信您连接实现数据交换,这个连接的一端称为一个socket。
- java中使用socket完成TCP程序的开发,使用此类方法可以方便的建立可靠地,双向的,持续性的,点对点得通讯连接
- 在socket的程序开发中,服务器端使用ServerSocket等待客户端的连接,对于java的网络程序来说,每一个客户端都是用一个socket对象表示。
二、代码示例
2.1 完成一次服务端与客户端通信
- 用本机的当做服务器与客户端进行通信。
- 服务端等待客户端的连接,在客户端连接后发送数据给客户端。
Server
package com.rrs.socketserver;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import org.junit.Test;
/**
* @author lzx
* on 2019/9/25.
*/
public class SocketServer {
@Test
public void test01() throws IOException {
System.out.println("socket server start...");
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
System.out.println("检测到客户端socket:" + socket);
OutputStream out = socket.getOutputStream();
String mString = "Hello Client";
byte[] bytes = mString.getBytes();
out.write(bytes);
socket.shutdownOutput();
out.close();
}
}
Client
package com.rrs.sockerclient;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.SocketAddress;
/**
* Created by lzx on 2019/9/25.
*/
public class SocketClient {
public static void main(String[] args) throws IOException {
System.out.println("socket client start...");
Socket socketClient = null;
socketClient = new Socket("127.0.0.1", 8888);
InputStream in = socketClient.getInputStream();
byte[] bytes = new byte[1024];
int len = in.read(bytes);
String msg = new String(bytes, 0, len);
System.out.println(msg);
}
}
2.2 完成客户端到服务端图片传输
Server 服务端等待客户端发送图片
package com.rrs.socketserver.server;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import org.junit.Test;
/**
* @author lzx
*
*/
public class ServerPic {
@Test
public void serverPic() throws IOException {
System.out.println("server start...");
// 创建socket
ServerSocket server = new ServerSocket(8899);
// 阻塞式监听客户端
Socket socket = server.accept();
// 获得输入流
InputStream in = socket.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
// 边读边写
// 写到服务端磁盘上
// 获得文件输出流
File file = new File("java.jpg");
FileOutputStream out = new FileOutputStream(file);
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
System.out.println("图片接受完毕...");
socket.shutdownInput();
in.close();
out.close();
}
}
Client 客户端发送图片
package com.rrs.socketserver.client;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import org.junit.Test;
/**
* @author lzx
*
*/
public class ClientPic {
@Test
public void clientPic() throws IOException {
System.out.println("client start...");
// 创建socket客户端
Socket client = new Socket("127.0.0.1", 8899);
// 从本地读取文件发送文件(边读边写)
// 读取文件
File file = new File("D:/Desktop/java.jpg");
FileInputStream in = new FileInputStream(file);
// 每次发送1k
byte[] buf = new byte[1024];
int len = 0;
OutputStream out = client.getOutputStream();
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
System.out.println("图片发送完成...");
out.close();
in.close();
client.shutdownOutput();
}
}