java socket-TCP

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java socket-TCP相关的知识,希望对你有一定的参考价值。

【服务端】
创建ServerSocket对象,绑定监听端口
通过accept()方法监听客户端请求
建立连接后,通过输入流读取客户端发送的请求信息
通过输出流向客户端发送响应信息
关闭相关资源
 
【客户端】
创建socket对象,指明需要连接的服务器地址和端口号
连接建立后,通过输出流向服务器端发送请求信息
通过输入流获取服务器响应信息
关闭相关资源
 
【多线程服务器】
应用多线程来实现服务器与多客户端之间的通信基本步骤
1.服务器端创建ServerSocket,循环调用accept()等待客户端连接
2.客户端创建一个socket并请求和服务器端的连接
3.服务器端接受客户端请求,创建socke与该客户建立专线连接
4.建立连接的两个socket在一个单独的线程上对话
5.服务器端继续等待新的连接
 
【代码】:
 
技术分享
package testsocket;
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;
/**
 * 服务器线程处理类
 * 
 * @author Buddha
 *
 */
public class ServerThread extends Thread {
    // 和本线程相关的Socket
    Socket socket = null;
    // 带参数的构造方法
    public ServerThread(Socket socket) {
        this.socket = socket;
    }
    // 线程执行的操作,响应客户端的请求
    public void run() {
        // 字节输入流
        InputStream is = null;
        // 为了提高读取的性能,将字节输入流进行包装,把它变为字符流
        InputStreamReader isr = null;
        // 为字符流添加缓冲,以缓冲的方式读取
        BufferedReader br = null;
        OutputStream os = null;
        // 转为打印流
        PrintWriter pw = null;
        // 选中要抛出异常的代码,按shift+alt+z 然后就可以选中try catch,会自动给你抛异常
        try {
            // 3.获取一个输入流,读取客户端信息
            is = socket.getInputStream();
            isr = new InputStreamReader(is);
            br = new BufferedReader(isr);
            // 获取客户端提交的信息
            String info = null;
            // 循环读取客户端提交的信息
            // 每次读取一行
            while ((info = br.readLine()) != null) {
                System.out.println("我是服务器,客户端说:" + info);
            }
            // 关闭输入流
            socket.shutdownInput();
            // 4.获取输出流,响应客户端的请求
            os = socket.getOutputStream();
            pw = new PrintWriter(os);
            pw.write("欢迎");
            pw.flush();// 刷新缓存
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            // 5.关闭资源
            try {
                //if (pw != null)
                    //对于同一个socket,如果关闭了输出流会导致socket也会被关闭,所以一般不用关闭输出流,直接关闭socket即可。
                    //pw.close();
                if (os != null)
                    os.close();
                if (os != null)
                    br.close();
                if (isr != null)
                    isr.close();
                if (is != null)
                    is.close();
                if (socket != null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
ServerThread.java
技术分享
package testsocket;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 基于TCP协议的通信,实现用户登录
 * @author Buddha
 * 服务器端
 */
public class Server {
    public static void main(String[] args) {
        try {
            //1.创建一个服务器端Socket,既ServerSocket,指定绑定的端口,并监听此端口
            ServerSocket serverSocket =new ServerSocket(8888);
            
            Socket socket=null;
            //记录客户端的数量
            int count = 0;
            //2.调用accept()方法开始监听,等待客户端的链接
            System.out.println("=======服务器即将启动,等待客户端的链接======");
            //循环监听等待客户端的链接
            while(true){
                socket=serverSocket.accept();
                //创建一个新的线程
                ServerThread serverThread=new ServerThread(socket);
                //设置线程优先级,1-10.默认为5,避免运行时速度慢
                serverThread.setPriority(4);
                //启动线程
                serverThread.start();
                //统计客户端的数量
                count++;
                System.out.println("客户端的数量:"+count);
                //获取InetAddress实例
                InetAddress address=socket.getInetAddress();
                //获取客户端的IP
                System.out.println("当前客户端的IP:"+address.getHostAddress());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }        
    }
}
Server.java
技术分享
package testsocket;
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 {
            // 1.创建客户端socket,指定服务器地址和端口
            Socket socket = new Socket("localhost", 8888);
            // 2.获取输出流,向服务器发送信息
            // 字节输出流
            OutputStream os = socket.getOutputStream();
            //将输出流包装为打印流
            PrintWriter pw =new PrintWriter(os);
            pw.write("用户名:admin;密码:123");
            //刷新缓存,向服务端输出信息
            pw.flush();
            //关闭输出流
            //不能使用pw.close()来关闭输出流,需要使用socket.shutdownOutput()来关闭当前的输出流,结束数据的输出
            socket.shutdownOutput();
            
            //3.获取输入流,并读取服务器端的响应信息
            InputStream is=socket.getInputStream();
            BufferedReader br= new BufferedReader(new InputStreamReader(is));
            String info =null;
            while((info=br.readLine())!=null){
                System.out.println("我是客户端,服务器说"+info);
            }
            
            //4.关闭资源
            br.close();
            is.close();
            pw.close();
            os.close();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //
    }
}
Client.java

 

以上是关于java socket-TCP的主要内容,如果未能解决你的问题,请参考以下文章

java代码在片段活动中不起作用

java 代码片段【JAVA】

# Java 常用代码片段

# Java 常用代码片段

创建片段而不从 java 代码实例化它

如何重构这个 Java 代码片段