之前学弟还问过我这个,但是都是肤浅的查查资料,晚上抽空在慕课系统的了解下,慢慢来吧.
首先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了