目录
一.Socket编程
1.网络编程概念
计算机网络的基本概念
互联网:网络的网络
IP地址:计算机在网络中的标识
网关:负责连接多个网络
协议:TCP/IP协议
IP协议:分组交换协议
TCP协议:面向连接,可靠传输
UDP协议:不面向连接,不可靠传输
2.TCP编程
客户端使用Socket(InetAddress, port)打开Socket
服务器端用ServerSocket监听端口
服务器端用accept接收连接并返回Socket
双方通过Socket打开InputStream / OutputStream读写数据
flush()用于强制输出缓冲区
//客户端
public class TCPClient {
public static void main(String[] args){
try {
InetAddress address = InetAddress.getLoopbackAddress();//返回本机地址 127.0.0.1
System.out.println("本机地址:" + address);
try (Socket socket = new Socket(address, 8099)) {
try (BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8))){
try(BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),StandardCharsets.UTF_8))){
writer.write("time\n");
writer.flush();
String line=reader.readLine();
System.out.println("收到服务器数据:"+line);
}
}
}
}catch (Exception e){
e.printStackTrace();
}
//end
}
}
//服务器端
public class TCPServer {
public static void main(String[] args){
try{
ServerSocket serverSocket=new ServerSocket(8099);
System.out.println("TCP server ready.");
Socket socket=serverSocket.accept();
try (BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream(),StandardCharsets.UTF_8))){
try(BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),StandardCharsets.UTF_8))){
String line=reader.readLine();
if("time".equals(line)){
writer.write(LocalDateTime.now().toString()+"\n");
writer.flush();
}else {
writer.write("sorry!\n");
writer.flush();
}
}
}
socket.close();
serverSocket.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
3.TCP多线程编程
服务器端使用无限循环
每次accept()返回后,创建新的线程来处理客户端请求每个客户端请求对应一个服务线程
使用线程池可以提高运行效率
//客户端
public class TCPClient {
public static void main(String[] args){
try {
InetAddress address = InetAddress.getLoopbackAddress();//返回本机地址 127.0.0.1
System.out.println("本机地址:" + address);
try(Socket socket = new Socket(address, 8099)) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8))) {
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8))) {
writer.write("time\n");
writer.flush();
String line = reader.readLine();
System.out.println("收到服务器数据:" + line);
Thread.sleep(3000);
writer.write("bye\n");
writer.flush();
line = reader.readLine();
System.out.println("收到:" + line);
}
}
}
}catch (Exception e){
e.printStackTrace();
}
//end
}
}
//服务端
public class TCPServer {
public static void main(String[] args){
try{
ServerSocket serverSocket=new ServerSocket(8099);
System.out.println("TCP server ready.");
while (true) {
Socket socket=serverSocket.accept();
System.out.println("Accept from " + socket.getRemoteSocketAddress());
new HandlerThread(socket).start();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
//服务端
public class HandlerThread extends Thread {
private Socket socket;
public HandlerThread(Socket socket){
this.socket=socket;
}
@Override
public void run(){
try {
System.out.println("线程开启 "+Thread.currentThread().toString());
try (BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8))) {
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8))) {
while (true) {
String line = reader.readLine();
if ("time".equals(line)) {
writer.write(LocalDateTime.now() + "\n");
writer.flush();
}else if("bye".equals(line)){
writer.write("bye\n");
writer.flush();
break;
}
}
}
}
}catch (IOException e){
e.printStackTrace();
}finally {
if(socket!=null){
try {
socket.close();
System.out.println("线程关闭 "+Thread.currentThread().toString());
}catch (IOException e){
e.printStackTrace();
}
}
}
}
public Socket getSocket() {
return socket;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
}