TCP编程

 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();

写网络数据时,必须要调用flush()方法,如果不调用,可能会发生两个端口都接收不到数据

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值