Socket:在开发网络应用程序的时候,会遇到Socket,其实它是一个抽象概念,一个应用程序通过一个Socke来建立一个远程连接,Socket内部则通过TCP/IP协议把数据传输到网络,使用Socket进行网络编程时,本质上就是进行两个进程之间的网络通信,其中一个进程充当服务器端,它主动监听某个指定端口,另外一个进程充当客户端,它必须主动连接服务器的IP地址和指定端口,如果连接成功,则建立一个TCP连接,双方可以发送和接收数据
使用java进行TCP编程时,需要使用Socket模型:
服务器端口用ServerSocket监听指定端口
客户端使用Socket(InetAddress,port)连接服务器
服务器端用accept()接收连接返回Socket实例
双方通过Socket打开InputStream/OutputStream读取数据
flish()方法用于强制输出缓冲区到网络
服务器
public stataic void main (String args){
Scanner input = new Scanner(System.in);
while(true){
//创建Socket
try(Socket client = new Socket("192.168.254.161",9966));
BUfferedWriter writer = new BUfferedWriter(new
OutputStreamWriter(client.getOutputStream()));
BUfferedReader reader = new BUfferedReader(new
InputStreamReader(client.getInputStream()));){
//获取控制台的问题
String question = input.nextLine();
if(question.equals("over")){
break;
}
//发送问题到服务器
writer.write(question);
writer.flish();
//暂时结束本次输出
client.shutdownOutput();
//获取来自服务器的答案
String answer = reader.readLine();
System.out.printLn("[客户端]来自服务器的回答" + answer);
}catch(IOException e){
e.printStackTrace();
}
System.out.printLn("GAME OVER");
}
}
客户端
public static void main(String args) throws IOException{
Map<String,String> chatMap = new HashMap<String,String>(){
{
put("咋","咋");
put("你想咋","你想咋");
put("跌了莫","跌了,你捏");
put("弄啥去","喔达去");
put("喔达是哪达","喔达就是喔达莫");
put("上号","端");
}
};
try(ServerSocket server = new ServerSocket(9966)){
while(true){
//与客户端连接
Socket client = server.accept();
//获取客户端的IP
String clientIP = client.getInetAddress().getHostAddress();
try(BUfferedReader reader = new BUfferedReader(new
InputStreamReader(client.getInputStream())));
BUfferedWriter writer = new BUfferedWriter(new
OutputStreamWriter(client.getOutputStream()));){
//获取客户端的提问
String question = read.readLine();
System.out.println("[服务器]来自客户端" + clientIP+"的提问"+question);
//获取问题的答案
String answer = chatMap.get(question);
answer = answer == null?"额不知道你说啥":answer;
writer.write(answer);
writer.flush();
}
}
}catch(IOException e){
e.printStackTrace();
}
}
Socket流
当Socket连接成功后,服务器和客户端都使用Socket实例来进行网络通信,TCP是一种基于流的协议,因此需要用到输出流和输入流来封装Socket的数据流
//用于读取网络数据
InputStream in = sock.getInputStream();
//用于写入网络数据
OutputStram out = sock.getOutputStream();