简单的TCP编程
模拟用户从客户端登入,服务器接收用户的登入的信息验证;
LoginServer.java服务端类:
说明:这次服务只是用一次,使用一次后就会关闭。实际上服务是一直开着的。
package tcp; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; /** * 登录的服务器 * @author superdrew * TCP 登录 * 功能:用户在客户端输入用户名和密码提交给服务器,服务器接收并处理,处理完后给客户端一个返回信息 * 客户端接口服务器的反馈消息并输出 * 问题分解1.先做一个单向通道,用户输入用户名和密码,服务器接收并输出 * 2.双向通道,服务器进行处理,处理完反馈一个信息给客户端,客户端接收并输出 * * 注意: 关闭IO流的同时 会关闭sockect * 总结: * 1.服务器创建ServerSocket,在指定端口监听并并处理请求 * 2.ServerSocket通过accept() 接收用户请求并返回对应的Socket,否则一种处于监听等待状态,线程也被阻塞 * 3.客户端创建Socket,需要指定服务器的ip和端口号,向服务器发送和接收响应 4.客户端发送数据需要输出流(写),客户端获取反馈数据需要输入流(读) 服务端反馈数据需要输出流(写),服务端获取请求数据需要输入流(读) 5.socket.getOutputStream() socket.getInputStream() 可以获取网络通信对方的字节流 6.一旦使用ServerSocket和Socket建立了网络连接后,网络通信和普通IO流操作并没有太大区别 7.网络通信输出流建议使用DataOutputStream和ObjectOutputStream与平台无关 输入流相应使用DataIntputStream和ObjectInputStream 8.如果是字符串通信也可以使用BufferedReader和PrintWriter,简单方便 9.关闭由socket产生的流,那么socket本身会关闭 * */ public class LoginServer { public static void main(String[] args) throws IOException { //1.创建一个serversocket 创建服务 ServerSocket serverSocket = new ServerSocket(8888);//端口 8888 IP地址是本机 //2.使用 serversocket 监听 socket 套接字 Socket socket = serverSocket.accept(); //3.接收用户请求,并处理 //InputStream is = new FileInputStream("C:/b.txt");从文件读取 InputStream is = socket.getInputStream(); DataInputStream dis = new DataInputStream(is); String result = dis.readUTF(); System.out.println("客户端发送来的消息request:"+result); //4.给客户端反馈一个消息 DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); dos.writeUTF("welcome!"); //5.关闭资源 System.out.println(socket.isClosed()); //false dos.close(); dis.close(); System.out.println(socket.isClosed()); //true socket.close(); serverSocket.close(); System.out.println(socket.isClosed()); //true } }
LoginClient.java客户端类:
package tcp; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; /** * 登录的客户端 * @author superdrew * */ public class LoginClient { public static void main(String[] args) throws UnknownHostException, IOException { //1.创建一个socket 连接服务器 Socket socket = new Socket(InetAddress.getLocalHost(), 8888);//必须要知道服务器IP和端口号 //2.通过 socket 发送数据给服务器 //OutputStream os = new FileOutputStream("C:/b.txt");输出到文件 String info = "username=superdrew&password=superdrew"; OutputStream os = socket.getOutputStream(); DataOutputStream dos = new DataOutputStream(os); dos.writeUTF(info); //3.接收服务器返回的消息 DataInputStream dis = new DataInputStream(socket.getInputStream()); String result = dis.readUTF(); System.out.println("服务器返回的消息response:"+result); //4.关闭资源 dis.close(); dos.close(); socket.close(); } }
结果展示: