1、TCP 网络通信编程
1.1、基本介绍


1.2、应用案例 1(使用字节流)

SocketTCP01Server.java
package socket;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketTCP01Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务端在 9999 端口监听, 等待连接...");
Socket socket = serverSocket.accept();
System.out.println("服务端 socket =" + socket.getClass());
InputStream inputStream = socket.getInputStream();
byte buf[] = new byte[1024];
int readLen = 0;
while ((readLen = inputStream.read(buf)) != -1) {
System.out.println(new String(buf, 0, readLen));
}
inputStream.close();
socket.close();
serverSocket.close();
}
}
SocketTCP01Client.java
package socket;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketTCP01Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("客户端 socket 返回=" + socket.getClass());
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello, server".getBytes());
outputStream.close();
socket.close();
System.out.println("客户端退出...");
}
}
SocketTCP01Server 控制台输出
服务端在 9999 端口监听, 等待连接…
服务端 socket =class java.net.Socket
hello, server
SocketTCP01Client 控制台输出
客户端 socket 返回=class java.net.Socket
客户端退出…
1.3、应用案例 2(使用字节流)

SocketTCP02Server.java
package socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketTCP02Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务端,在 9999 端口监听, 等待连接...");
Socket socket = serverSocket.accept();
System.out.println("服务端 socket=" + socket.getClass());
InputStream inputStream = socket.getInputStream();
byte[] buf = new byte[1024];
int readLen = 0;
while ((readLen = inputStream.read(buf)) != -1) {
System.out.println(new String(buf, 0, readLen));
}
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello, client".getBytes());
socket.shutdownOutput();
outputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
SocketTCP02Client.java
package socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketTCP02Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("客户端 socket 返回=" + socket.getClass());
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello, server".getBytes());
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
byte[] buf = new byte[1024];
int readLen = 0;
while ((readLen = inputStream.read(buf)) != -1) {
System.out.println(new String(buf, 0, readLen));
}
inputStream.close();
outputStream.close();
socket.close();
System.out.println("客户端退出...");
}
}
SocketTCP02Server 控制台输出
服务端,在 9999 端口监听, 等待连接…
服务端 socket=class java.net.Socket
hello, server
SocketTCP02Client 控制台输出
客户端 socket 返回=class java.net.Socket
hello, client
客户端退出…
1.4、应用案例 3(使用字符流)

SocketTCP03Server.java
package socket;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketTCP03Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务端, 在 9999 端口监听, 等待连接...");
Socket socket = serverSocket.accept();
System.out.println("服务端 socket =" + socket.getClass());
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
System.out.println(s);
OutputStream outputStream = socket.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello client 字符流");
bufferedWriter.newLine();
bufferedWriter.flush();
bufferedWriter.close();
bufferedReader.close();
socket.close();
serverSocket.close();
}
}
SocketTCP03Client.java
package socket;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketTCP03Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("客户端 socket 返回=" + socket.getClass());
OutputStream outputStream = socket.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello, server 字符流");
bufferedWriter.newLine();
bufferedWriter.flush();
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
System.out.println(s);
bufferedReader.close();
bufferedWriter.close();
socket.close();
System.out.println("客户端退出...");
}
}
SocketTCP03Server 控制台输出
服务端, 在 9999 端口监听, 等待连接…
服务端 socket =class java.net.Socket
hello, server 字符流
SocketTCP02Client 控制台输出
客户端 socket 返回=class java.net.Socket
hello client 字符流
客户端退出…
1.5、应用案例 4(文件上传)

StreamUtils.java
package upload;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class StreamUtils {
public static byte[] streamToByteArray(InputStream is) throws Exception {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int len;
while ((len = is.read(b)) != -1) {
bos.write(b, 0, len);
}
byte[] array = bos.toByteArray();
bos.close();
return array;
}
public static String streamToString(InputStream is) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
builder.append(line + "\r\n");
}
return builder.toString();
}
}
TCPFileUploadServer.java
package upload;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPFileUploadServer {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务端在8888端口监听...");
Socket socket = serverSocket.accept();
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
byte[] bytes = StreamUtils.streamToByteArray(bis);
String destFilePath = "src\\abc.mp4";
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
bos.write(bytes);
bos.close();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("收到视频");
writer.flush();
socket.shutdownOutput();
writer.close();
bis.close();
socket.close();
serverSocket.close();
}
}
TCPFileUploadClient.java
package upload;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class TCPFileUploadClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
String filePath = "e:\\abc.mp4";
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
byte[] bytes = StreamUtils.streamToByteArray(bis);
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bos.write(bytes);
bis.close();
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
String s = StreamUtils.streamToString(inputStream);
System.out.println(s);
inputStream.close();
bos.close();
socket.close();
}
}
TCPFileUploadServer 控制台输出
服务端在8888端口监听…
TCPFileUploadClient 控制台输出
收到视频