java进阶开发-----socket编程或TCP通信模型

(一)、线程池TCP通信 //旨在多个socket建立一起运行
1.服务端

import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

public class ServerDemo2 {
    //使用静态变量记住一个线程池
    private static ExecutorService pool = new ThreadPoolExecutor(3,5,
            6, TimeUnit.SECONDS,new ArrayBlockingQueue<>(2), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
    public static void main(String[] args) {
        try {
            System.out.println("服务端启动成功");
            ServerSocket serverSocket = new ServerSocket(7777);
            while(true){
                Socket socket = serverSocket.accept();
                System.out.println(socket.getLocalSocketAddress() + "来了");
                Runnable target = new ServerReaderRunnable(socket);
                pool.execute(target);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Runnable继承类实现线程交互
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class ServerReaderRunnable implements Runnable{
    private Socket socket;
    public ServerReaderRunnable(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
        InputStream is = socket.getInputStream();

//getInputStream方法得到的是一个输入流,服务端的Socket对象上的getInputStream方法得到的输入流其实就是从客户端发送给服务器端的数据流。
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String msg;
        while ((msg = br.readLine()) != null){
            System.out.println(socket.getRemoteSocketAddress() + "说:" + msg);
        }
        } catch (IOException e) {
            System.out.println(socket.getRemoteSocketAddress());
        }
    }
}

2.客户端

import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class ClientDemo1 {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("127.0.0.1",7777);
            OutputStream os = socket.getOutputStream();
//getOutputStream方法得到的是一个输出流,客户端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给服务器端的数据。
            PrintStream ps = new PrintStream(os);
            Scanner sc = new Scanner(System.in);
             while(true){
                System.out.println("请说:");
                String msg = sc.nextLine();
                ps.println(msg);
                ps.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

(二)、TCP即时通信
1.服务端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class ServerDemo3 {
    public static List<Socket> allOnLineSockets = new ArrayList<>();
    //收集socket,到时候一起遍历,增删也快捷
    public static void main(String[] args) throws Exception{
        System.out.println("服务端启动成功");
        ServerSocket serverSocket = new ServerSocket(7777);
        while(true){
            Socket socket = serverSocket.accept();
            System.out.println(socket.getRemoteSocketAddress() + "来了!");
            allOnLineSockets.add(socket);
            new ServerReaderThread(socket).start();
        }
    }
}

class ServerReaderThread extends Thread {
    private Socket socket;
    public ServerReaderThread(Socket socket) {
        this.socket = socket;
    }
    public void run(){
        try {
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line;
            while ((line = br.readLine())!=null){
                System.out.println(socket.getRemoteSocketAddress() + "发了:" +line);
                //把消息进行端口发出去
                sendMsgToAll(line);
            }
        } catch (Exception e) {
            System.out.println(socket.getRemoteSocketAddress()+"下线了,下次再来!");
            ServerDemo3.allOnLineSockets.remove(socket);
        }
    }
    private void sendMsgToAll(String msg) throws Exception {
        for (Socket allOnLineSocket : ServerDemo3.allOnLineSockets) {
            PrintStream ps = new PrintStream(socket.getOutputStream());
            ps.println(msg);
            ps.flush();
        }
    }
}

2.客户端

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class ClientDemo1 {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("127.0.0.1",7777);
            OutputStream os = socket.getOutputStream();
            PrintStream ps = new PrintStream(os);
            Scanner sc = new Scanner(System.in);
             while(true){
                System.out.println("请说:");
                String msg = sc.nextLine();
                ps.println(msg);
                ps.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class CilentReaderThread extends Thread{//客户端读消息
    private Socket socket;
    public CilentReaderThread(Socket socket){
        this.socket = socket;
    }
    public void run(){
        try {
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line;
            while((line = br.readLine())!=null){
                System.out.println("收到消息" + line);
            }
        } catch (Exception e){
            System.out.println("服务端把你踢出去了!");
        }
    }
}

(三)、TCP通信实现BS请求网页信息(基础)
HTTP响应数据的协议格式:就是给浏览器显示的网页信息

import java.io.*;
import java.net.Socket;

public class ServerReaderRunnable implements Runnable{
    private Socket socket;
    public ServerReaderRunnable(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            //响应消息给浏览器
            PrintStream ps = new PrintStream(socket.getOutputStream());
            //必须相应HTTP协议格式数据,否则不通
            ps.println("HTTP/1.1 200 OK");//协议类型和版本,响应成功的消息
            ps.println("Content-Type:text/htnl;charset=UTF-8");//响应的数据类型:文本/网页
            ps.println();//必须发一个空行
            //以上操作之后才能响应数据给浏览器
            ps.println("<span style='color:red;font-size:90px'> 超级无敌牛逼 </span>");
            ps.close();
        } catch (Exception e) {
            System.out.println(socket.getRemoteSocketAddress());
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

符气满满

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值