在后面的关闭资源中,我把输入输出相关的流关闭注释了,是因为对于同一个Socket,关闭socket的时��也会把输入输出流关闭,直接关闭socket就行,当然保留也是可以的。
package com.linuxidc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) { try { //创建客户端Socket,指定服务器地址和端口 Socket socket = new Socket("localhost", 8888); //建立连接后,获取输出流,向服务器端发送信息 OutputStream os = socket.getOutputStream(); //输出流包装为打印流 PrintWriter pw = new PrintWriter(os); //向服务器端发送信息 pw.write("用户名:zzh;密码:123");//写入内存缓冲区 pw.flush();//刷新缓存,向服务器端输出信息 socket.shutdownOutput();//关闭输出流 //获取输入流,接收服务器端响应信息 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is, "GBK")); String data = null; while((data=br.readLine())!= null){ System.out.println("我是客户端,服务器端提交信息为:"+data); } //关闭其他资源 // br.close(); // is.close(); // pw.close(); // os.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
1.8 先运行服务器端,在运行客户端
此时在看服务器控制台:服务器端一直在循环侦听客户端的连接
1.9 进行第二个客户端的连接
修改相应信息将用户名zzh改为admin。运行客户端,打开服务端控制台
输出客户端的ip都为127.0.0.1,是因为服务器和客户端都是本机,在真实的环境中会显示客户端的ip地址信息。
二. 通过Socket实现UDP编程
2.1 UDP编程
UDP协议又叫用户数据报协议,是无连接,不可靠的,无序的。特点是传输速度相对要快,UDP协议以数据报作为数据传输的载体。当进行数据传输时,首先需要将要传输的数据定义成数据报(Datagram),在数据报中指明数据所要达到的Socket(主机地址和端口号),然后再将数据报发送出去。相关操作类有:DatagramPacket数据报包,DatagramSocket进行端到端通信的类。
2.2 服务器端实现套路
1.创建DatagramSocket,指定端口号。2.创建DatagramPacket。3.接收客户端发送的数据信息。4.读取数据。
2.3 客户端实现套路
1.定义发送信息,比如发送地址,端口号和内容。2. 创建DatagramPacket,包含将要发送的信息。3.创建DatagramSocket。4.发送数据。
2.4 多线程实现服务器与多客户端之间通信步骤
1.服务器端创建DatagramSocket的实例socket,循环调用receive()方法,此方法在接收到数据报之前会一直阻塞。
2.客户端创建DatagramSocket,将含有地址,端口号和内容的数据报包发送出去。
3. 服务器端收到数据报包packet,通过DatagramSocket和packet与客户端建立一个线程
4. 服务器端继续等待新的数据报包。