Java学习5-socket通信(2)
2019-06-22 本文已影响0人
持之以蘅
- 基于TCP协议的socket通信
- 目标:了解概念,通信模型,实现socket的步骤,服务端和客户端应该做些什么
什么是scoket
- 套接字,用来描述IP地址和端口(上篇已经提到过),通信链的句柄;应用程序通过其向网络发送请求或者应答网络请求;包含进行网络通信所必须的五种信息:连接所是哟个的协议;本机的IP地址;本地远程的协议端口;远地主机的IP地址以及远地进程的协议端口。
通信模型
image.png
实现步骤
- 创建 server socket 和socket
- 打开连接到的socket的输入/输出流
- 按照协议对socket进行读/写操作
- 关闭输入输出流,以及socket
服务端设计
好像找到我要用的地方了,服务端
步骤
- 创建server socket对象,绑定监听得端口
- 调用accept()方法监听客户端的请求
- 连接建立后,通过输入流读取客户端发送的请求信息
- 通过输出流向客户端发送响应信息
- 关闭相关资源
public class SocketServer {
public static void main(String[] args) throws IOException {
//1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(12345);
InetAddress address = InetAddress.getLocalHost();
String ip = address.getHostAddress();
Socket socket = null;
//2.调用accept()等待客户端连接
System.out.println("~~~服务端已就绪,等待客户端接入~,服务端ip地址: " + ip);
socket = serverSocket.accept();
//3.连接后获取输入流,读取客户端信息
InputStream is=null;
InputStreamReader isr=null;
BufferedReader br=null;
OutputStream os=null;
PrintWriter pw=null;
is = socket.getInputStream(); //获取输入流
isr = new InputStreamReader(is,"UTF-8");
br = new BufferedReader(isr);
String info = null;
while((info=br.readLine())!=null){//循环读取客户端的信息
System.out.println("客户端发送过来的信息" + info);
}
socket.shutdownInput();//关闭输入流
socket.close();
}
}
-
显示有问题
原因还未找到
image.png
客户端设计
- 创建socket对象,指明需要链接的服务器的地址和端号
- 链接建立后,通过输出流向服务器发送请求信息
- 通过输出流获取服务器响应的信息
- 关闭相关资源
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn_accept = (Button) findViewById(R.id.btn_accept);
btn_accept.setOnClickListener(this);
}
@Override
public void onClick(View v) {
new Thread() {
@Override
public void run() {
try {
acceptServer();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
private void acceptServer() throws IOException {
//1.创建客户端Socket,指定服务器地址和端口
Socket socket = new Socket("172.16.2.54", 12345);
//2.获取输出流,向服务器端发送信息
OutputStream os = socket.getOutputStream();//字节输出流
PrintWriter pw = new PrintWriter(os);//将输出流包装为打印流
//获取客户端的IP地址
InetAddress address = InetAddress.getLocalHost();
String ip = address.getHostAddress();
pw.write("客户端:~" + ip + "~ 接入服务器!!");
pw.flush();
socket.shutdownOutput();//关闭输出流
socket.close();
}
}
- 结果好像依旧不行先放在这里吧