简单的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();
    }
}

结果展示:

原文地址:https://www.cnblogs.com/superdrew/p/8098488.html