JAVA-网络编程-TCP通信
TCP Server ServerSoket类
- 此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
- ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接就一直处于等待状态。
构造方法
方法 | 说明 |
---|---|
ServerSocket() |
创建非绑定服务器套接字 |
ServerSocket(int port) |
创建绑定到特定端口的服务器套接字 |
方法
返回值类型 | 方法 | 说明 |
---|---|---|
Socket |
accept() |
侦听并接受到此套接字的连接 |
返回的socket是客户端发来的请求产生的互相连接的对象
TCP Client Socket类
- 此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
构造方法
方法 | 说明 |
---|---|
Socket() |
通过系统默认类型的 SocketImpl 创建未连接套接字 |
Socket(InetAddress address, int port) |
创建一个流套接字并将其连接到指定 IP 地址的指定端口号 |
方法
返回值类型 | 方法 | 说明 |
---|---|---|
OutStream |
getOutputStream() |
返回此套接字的输出流 |
InputStream |
getInputStream() |
返回此套接字的输入流 |
代码
Client发送数据包
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
// socket对象
Socket socket = new Socket("127.0.0.1", 6667);
// 输出流
OutputStream os = socket.getOutputStream();
// 封装数据
os.write("nihao ".getBytes());
// 关闭资源
os.close();
}
}
Server接收数据包
public class Server {
public static void main(String[] args) throws IOException {
// 服务器socket实例
ServerSocket server = new ServerSocket(6667);
Socket socket = server.accept();
// 获取输入流
InputStream is = socket.getInputStream();
// 解包
byte[] bytes = new byte[1024];
int len = is.read(bytes);
String ip = socket.getInetAddress().getHostAddress();
System.out.println("ip:" + ip + ":" + new String(bytes, 0, len));
// 释放资源
is.close();
server.close();
}
}
文件传输:
Client发送文件
public class TCPFileClient {
public static void main(String[] args) throws UnknownHostException, IOException {
// 将本地文件上传至服务器
// 创建客户端对象
Socket socket = new Socket("127.0.0.1", 6669);
// 读取数据
FileInputStream fis = new FileInputStream("D:/io1227/print.txt");
// 目的地
OutputStream os = socket.getOutputStream();
// 创建字节数组缓冲区
byte[] bytes = new byte[1024];
// 发送数据
int len ;
while ((len = fis.read()) != -1) {
os.write(bytes, 0, len);
}
// 给输出流加结束标记
socket.shutdownOutput();
// TODO 接收回复
InputStream is = socket.getInputStream();
// 获取ip地址
String ip = socket.getInetAddress().getHostAddress();
len = is.read(bytes);
System.out.println("ip:" + ip + ",内容为:" + new String(bytes, 0, len));
// 关闭资源
fis.close();
socket.close();
}
}
Server单线程接收数据包
public class TCPFileSever {
public static void main(String[] args) throws IOException {
// 创建服务器实例
ServerSocket sever = new ServerSocket(6669);
// 获取连接实例并获取输出流
Socket socket = sever.accept();
// 数据源
InputStream is = socket.getInputStream();
// 目的地,先判断文件夹是否存在
File file = new File("D:/io1227/upload");
if (!file.exists()) {
file.mkdirs();
}
// 封装文件名
String fileName = "oracle" + System.currentTimeMillis() +
new Random().nextInt(999999) + ".txt";
FileOutputStream fos = new FileOutputStream(file + file.separator + fileName);
// 建立字节缓冲区
byte[] bytes = new byte[1024];
// 接收数据
int len ;
while ((len = is.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
// 回复信息
// socket.getOutputStream().write("收到".getBytes());
OutputStream os = socket.getOutputStream();
os.write("收到".getBytes());
// 释放资源
sever.close();
fos.close();
}
}
Sever多线程接收
// Runnable实现类
public class Upload implements Runnable{
private Socket socket ;
public Upload(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
FileOutputStream fos= null;
try {
// 数据源
InputStream is = socket.getInputStream();
// 目的地,先判断文件夹是否存在
File file = new File("D:/io1227/upload");
if (!file.exists()) {
file.mkdirs();
}
// 封装文件名
String fileName = "oracle" + System.currentTimeMillis() +
new Random().nextInt(999999) + ".txt";
fos = new FileOutputStream(file + file.separator + fileName);
// 建立字节缓冲区
byte[] bytes = new byte[1024];
// 接收数据
int len ;
while ((len = is.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
// 回复信息
// socket.getOutputStream().write("收到".getBytes());
OutputStream os = socket.getOutputStream();
os.write("收到".getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 释放资源
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
// 主线程
public class Demo01 {
public static void main(String[] args) throws IOException {
// 创建服务器实例
ServerSocket sever = new ServerSocket(6669);
while (true) {
// 获取连接实例并获取输出流
Socket socket = sever.accept();
// 创建线程任务
Upload upload = new Upload(socket);
// 创建线程任务
Thread th = new Thread(upload);
// 开启线程
th.start();
}
}
}