Socket用法
Socket是一种网络通信的编程接口,通过TCP/IP
协议将数据传输到网络上
在使用Socket进行编程时,其本质就是俩个进程之间的网络通信。分别为服务器端和客户端,其中服务器端会监听某个指定的端口,客户端连接服务器端的Ip
和指定端口
服务器端
- 创建服务器端Socket对象,来监听端口
- 当服务器段启动时会进去等待状态;
若没有客户端连接,accpet()
处于等待阻塞状态
若有客户端连接,accpet()
则返回当前正在连接的Socket - 服务器端通过
BufferedReader
读取客户端信息
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
//创建服务端Socket对象,监听1128端口
try(ServerSocket serverSocket = new ServerSocket(1128)){
while(true){
Socket accept = serverSocket.accept();
InetAddress inetAddress = accept.getInetAddress();
// System.out.printf("客户端%s正在输入~",inetAddress.getHostAddress());
// System.out.println();
//服务端读取客户端信息
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(accept.getInputStream(),"GBK"));
String s = bufferedReader.readLine();
System.out.printf("客户端%s说:%s",inetAddress.getHostAddress(),s);
System.out.println();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
客户端
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
try(Socket socket = new Socket("192.168.199.148",1128)) {
//客户端向向服务端发送信息
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //创建输出流
bufferedWriter.write("999");
bufferedWriter.flush();
}catch (IOException e){
e.printStackTrace();
}
}
}
flush()
方法会强制将所有缓冲区中的数据立即写入到输出流中,并清空缓冲区,确保数据及时地输出到目的地在我们写入网络数据时,如果不调用该方法,我们可能会发现客户端及服务器端都收不到数据,因为以流的形式写入数据时,是先存入内存的缓冲区中,等到缓冲区满了以后才会一次性发送,所以当我们想要在缓冲区数据不满的情况下发送数据就必须调用flush()
方法
当客户端需要连续对服务器端发送信息时需要使用到
shutdownOutput()
方法来短暂的关闭输出流
示例:
import java.io.*;
import java.net.InetAddress;;
import java.net.Socket;
import java.util.Scanner;
public class SzClient {
public static void main(String[] args) {
try(Scanner sc = new Scanner(System.in)){
String question = sc.nextLine();
//创建Socket
try(Socket socket = new Socket(InetAddress.getLocalHost(),1128);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))
){
//发送问题
bufferedWriter.write(question);
bufferedWriter.flush();
//暂时关闭输出流
socket.shutdownOutput();
//接受答案
String ans = bufferedReader.readLine();
System.out.println("回答:"+ans);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}