简单的一对一Socket通信

之前学弟还问过我这个,但是都是肤浅的查查资料,晚上抽空在慕课系统的了解下,慢慢来吧.

首先Socket通信需要创建一个服务端和一个客户端

建立连接后,既可以通过字节流进行通信了.

这里加上一些自己的看法吧,已经一些遇到的小疑惑

首先看一下Server端


import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {


    public static void main(String[] args) throws Exception{

        //1.创建一个服务端socket
        ServerSocket serverSocket=new ServerSocket(8888);
        //2调用accept方法等待连接,线程会阻塞状态
        System.out.println("Socket服务已启动,等待连接");
        Socket socket=serverSocket.accept();
        System.out.println("接收到客户端连接请求");
        //3.实现数据的交互
        //获取输入流
        InputStream inputStream= socket.getInputStream();
        InputStreamReader isr=new InputStreamReader(inputStream);
        BufferedReader br=new BufferedReader(isr);

        String  info=null;
        while((info=br.readLine())!=null){//循环读取信息
            System.out.println("收到客户端的请求:"+info);
        }
        socket.shutdownInput();

        //4.获取输出流,相应客户端请求
        OutputStream os=socket.getOutputStream();
        PrintWriter out=new PrintWriter(os);
        out.write("这是server端");
        out.flush();



        //关闭资源
        out.close();
        os.close();

        br.close();
        isr.close();
        isr.close();
        socket.close();
        serverSocket.close();
    }
}

然后是客户端

import java.io.*;
import java.net.Socket;

public class SocketClient {
    public static void main(String[] args)throws Exception {

        //1.创建Socket客户端,指定服务器和端口
        Socket socket=new Socket("127.0.0.1",8888);

        //2.连接成功后发送信息
        //获取输出流
       OutputStream outputStream=socket.getOutputStream();
       PrintWriter out=new PrintWriter(outputStream);
       out.write("admin,admin");
       out.flush();

//这一句很重要,要写在前面,如果不写在这里,Socket Server 端的代码就会卡在读取inputStream中
        socket.shutdownOutput();

       //3.获取输入流得到服务器端的响应
        InputStream inputStream= socket.getInputStream();
        InputStreamReader isr=new InputStreamReader(inputStream);
        BufferedReader br=new BufferedReader(isr);

        String  info=null;
        while((info=br.readLine())!=null){//循环读取信息
            System.out.println("收到服务端的响应:"+info);
        }


        br.close();
        isr.close();
        out.close();

       out.close();
       socket.close();


    }
}


注意一下Client 端的关系OutPutStream的关闭顺序

然后是代码的运行,首先是启动Server端,

在这里插入图片描述

然后启动Client端看一下

在这里插入图片描述

Client端已经收到Server 发回的消息了

在切换到Server 的console 看一下
在这里插入图片描述
收到了客户端发来的请求.

这样服务端和客户端就完成了一次简单的通信
通信结束,clinet和server端同时运行结束

这次我们用第三方软件玩一下

首先启动我们的Socket Server,但是不运行Socket 的Client

使用windows 的友善串口助手,或者mac 的YTNetWork 作为Clinet

这里以YTNetWork 举例

在这里插入图片描述

在发送的时候遇到一个问题,就是不管我怎么发送,server就是不打印出数据,只有客户端断开连接才显示,很郁闷,难不成发一次消息要断开连接一次么?

后来发现原来发送消息的时候,后面要加一个回车,这样就可以收发消息了.

在这里插入图片描述

为啥要回车了?

看下代码,因为代码里面是readLine啊
在这里插入图片描述

至此,简单的socket通信就ok了

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值