通过Socket实现TCP编程

基于Tcp的Socket通信原理
Java socket通信通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。socket 开发分客户端与服务端,服务端ServerSocket开启服务监听某一端口,客户端socket向此服务器的这个端口发出请求,成功则会建立会话,形成通道,这个通道若不做其它操作会一直存在,就是所谓的长连接了,这时服务端与客户端可以通过此通道进行即时通信.

通信模型:
这里写图片描述

服务器端的实现:

package Socket;

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.ServerSocket;
import java.net.Socket;

/*
 * 
 * 服务器端
 * 基于TCP协议的Socket通信
 * 
 * */
public class Server {

    public static void main(String[] args) throws IOException {
        // 1.创建ServerSocket对象,绑定监听端口,并监听此端口
        ServerSocket serverSocket = new ServerSocket(8880);
        // 2.通过accept方法监听客户端请求,等待客户端的连接
        Socket socket = socket = serverSocket.accept();
        //3.连接建立后,通过输入流读取客户端发送的请求信息
        InputStream is = socket.getInputStream();//字节输入流
        InputStreamReader isr = new InputStreamReader(is);//转为字符流
        BufferedReader br = new BufferedReader(isr);//添加缓冲
        String info = null;
        while((info = br.readLine())!= null) {
            System.out.println("服务器端收到的客户端传来的请求内容为:"+info);
        }
        //4.通过输出流向客户端发出响应信息
        OutputStream os = socket.getOutputStream();
        PrintWriter print = new PrintWriter(os);
        print.write("欢迎您!");
        print.flush();
        socket.shutdownOutput();
        // 5.关闭相关资源
        serverSocket.close();
    }

}

客户端的实现

package Socket;

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;

/*
 * 
 * 客户端
 * 基于TCP协议的Socket通信
 * 
 * */
class Client {

    public static void main(String[] args) throws UnknownHostException,
            IOException {
        // 1.创建Socket对象,指明要连接的服务器地址和端口号
        Socket socket = new Socket("localhost", 8888);
        // 2.连接建立后,通过输出流向服务器端发送请求
        OutputStream os = socket.getOutputStream();// 字节输出流
        PrintWriter print = new PrintWriter(os); // 将字节输出流包装为打印输出流
        print.write("用户名:admin; 密码:123");
        print.flush();
        socket.shutdownOutput();
        // 3.通过输入流读取服务器端响应的信息
        InputStream is = socket.getInputStream();// 字节输入流
        InputStreamReader isr = new InputStreamReader(is);// 转为字符流
        BufferedReader br = new BufferedReader(isr);// 添加缓冲
        String info = null;
        while ((info = br.readLine()) != null) {
            System.out.println("客户端收到的服务器端传来的响应内容为:" + info);
        }
        // 4.关闭相关资源
        socket.close();
    }

}

应用多线程来实现服务器与多线程之间的通信
步骤如下:
1、服务器端创建ServerSocket,循环调用accept()等待客户端链接
2、客户端创建一个Socket并请求和服务器端链接
3、服务器端接受客户端请求,创建socekt与该客户端建立专线链接
4、建立链接的socket在一个单独的线程上对话
5、服务器继续等待新的链接

服务器端多线程的实现

package Socket;

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;

public class ServerThread extends Thread {
    Socket socket  = null;
    ServerThread(Socket socket ) {
        this.socket  = socket;
    }
    public void run(){
        //3.连接建立后,通过输入流读取客户端发送的请求信息
        try {
            InputStream is = socket.getInputStream();//字节输入流
            InputStreamReader isr = new InputStreamReader(is);//转为字符流
            BufferedReader br = new BufferedReader(isr);//添加缓冲
            String info = null;
            while((info = br.readLine())!= null) {
                System.out.println("服务器端收到的客户端传来的请求内容为:"+info);
            }
            //4.通过输出流向客户端发出响应信息
            OutputStream os = socket.getOutputStream();
            PrintWriter print = new PrintWriter(os);
            print.write("欢迎您!");
            print.flush();
            socket.shutdownOutput();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

服务器端的实现

package Socket;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * 
 * 服务器端
 * 基于TCP协议的Socket通信
 * 
 * */
public class Server {

    public static void main(String[] args) throws IOException {
        // 1.创建ServerSocket对象,绑定监听端口,并监听此端口
        ServerSocket serverSocket = new ServerSocket(8880);
        // 2.通过accept方法监听客户端请求,等待客户端的连接
        Socket socket = null;
        int count = 0;
        while (true) {
            socket = serverSocket.accept();
            Thread thread = new ServerThread(socket);
            thread.start();
            count++;
            System.out.println("客户端的数量为:"+count);
        }
        // 5.关闭相关资源
        //serverSocket.close();
    }

}

客户端的实现
与上述无异

package Socket;

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;

/*
 * 
 * 客户端
 * 基于TCP协议的Socket通信
 * 
 * */
class Client {

    public static void main(String[] args) throws UnknownHostException,
            IOException {
        // 1.创建Socket对象,指明要连接的服务器地址和端口号
        Socket socket = new Socket("localhost", 8888);
        // 2.连接建立后,通过输出流向服务器端发送请求
        OutputStream os = socket.getOutputStream();// 字节输出流
        PrintWriter print = new PrintWriter(os); // 将字节输出流包装为打印输出流
        print.write("用户名:admin; 密码:123");
        print.flush();
        socket.shutdownOutput();
        // 3.通过输入流读取服务器端响应的信息
        InputStream is = socket.getInputStream();// 字节输入流
        InputStreamReader isr = new InputStreamReader(is);// 转为字符流
        BufferedReader br = new BufferedReader(isr);// 添加缓冲
        String info = null;
        while ((info = br.readLine()) != null) {
            System.out.println("客户端收到的服务器端传来的响应内容为:" + info);
        }
        // 4.关闭相关资源
        socket.close();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值