Java网络编程

喜你入骨 提交于 2019-12-27 07:22:59

简单的B/S程序:

服务端程序:

package com.wx.socket;

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

public class TcpServer extends Thread{

    //定义服务器接口Server Socket
    ServerSocket serverSocket = null;
    //定义一个服务器,定义端口
    public TcpServer(int port){
        try {
            serverSocket = new ServerSocket(port);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        super.run();
        System.out.println("服务器再启动中。。。等待用户的连接");
        while(true){
            //建立socket接口,accept方法是一个阻塞进程,等待有用户连接才往下走
            try {
                Socket socket = serverSocket.accept();
                //通过socket对象可以获取输出流,用来写数据
                OutputStream OutputStream =  socket.getOutputStream();
                //向客户端发送消息
                OutputStream.write("服务器正在向你发送消息!".getBytes());
                //在服务器上显示连接的上的电脑
                System.out.println(socket.getInetAddress().getHostAddress()+"连接上了!");
                //通过socket对象获得输入流,用来读取用户对象
                InputStream inputStream = socket.getInputStream();
                //读取数据
                int len = 0;
                byte[] bytes = new byte[1024];
                while((len = inputStream.read(bytes))!=-1){
                    //直接将获得的数据打印出来
                    System.out.println("服务器接受的客户端的数据:"+new String(bytes,0,len));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        //定义服务器监听的端口
        int port = 8809;
        TcpServer tcp_server = new TcpServer(port);
        tcp_server.start();
    }
}

客户端程序:

package com.wx.socket;

import sun.reflect.generics.scope.Scope;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TcpClient{
    //定义一个Socket对象
    Socket socket = null;
    public TcpClient(String host,int port){

        try {
            //需要服务器的ip地址和端口号,才能获得正确的Socket对象
            socket = new Socket(host,port);
            new SendMessThread(socket).start();
            int len = 0;
            byte[] bytes = new byte[1024];
            while((len = socket.getInputStream().read(bytes))!=-1){
                System.out.println("客户端接收服务端请求:"+new String(bytes,0,len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        //定义主机号
        String host = "localhost";
        //定义端口号
        int port = 8809;
        TcpClient tcpClient = new TcpClient(host,port);

    }
}

客户端给服务器端发送消息线程

package com.wx.socket;

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

public class SendMessThread extends Thread{
    Socket socket = null;
    public SendMessThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        super.run();

        OutputStream outputStream = null;
        try {
            outputStream = socket.getOutputStream();
            Scanner scanner = new Scanner(System.in);
            String in = "";
            do{
                in = scanner.next();
                outputStream.write(in.getBytes());
                outputStream.flush();
            }while(!"byte".equals(in));
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

 

多客户B/S程序

多客户连接服务器,服务器接收客户端发送的消息,给所有的客户端发送,某一个客户端给服务器发送的消息内容

服务器:

package com.wx.socket;

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**
 * 可以实现和客户端的相互发送消息的交互,可以是多台电脑
 */
public class Server2 extends Thread{
    //用来存放连接上的用户的socket对象的值
    List<Socket> list = new ArrayList<>();

    //定义服务器接口,ServerSocket
    ServerSocket serverSocket = null;

    public Server2(){}
    //定义一个服务器,定义端口
    public Server2(int port){
        try {
            serverSocket = new ServerSocket(port);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        super.run();
        try{
            while(true){
                //建立socket接口,accept方法是一个阻塞进程,等到有用户连接才往下走
                //定义soket类
                Socket socket = serverSocket.accept();
                //在服务器显示连接上的电脑
                String message = socket.getInetAddress().getHostAddress().toString();
                System.out.println(message+" 连接上了");
                //向用户发送消息
                sendMessageToAllUser(message);
                //将连接上的用户添加到集合里面去
                list.add(socket);
                //开始新连接用户的线程,用于该可以一直读取数据
                new ReaderThread(socket,this).start();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //把消息发到每个用户,涉及到写的操作OutputStream
    public void sendMessageToAllUser(String message) {
        //拿到每个用户的socket对象,对其进行写入数据
        for(Socket socket:list){
            if(socket !=null && socket.isConnected()){
                try{
                    OutputStream outputStream = socket.getOutputStream();
                    outputStream.write(message.getBytes());
                    outputStream.flush();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        //定义端口
        int port = 8808;
        Server2 server2 = new Server2(port);
        server2.start();
    }
}

服务器中给所有客户发送消息的线程

package com.wx.socket;

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

public class ReaderThread extends Thread{
    InputStream inputStream = null;
    Server2 server2 = null;
    //这里传入一个socket对象,因为每一个用户都用一个不同的线程存放socket对象进行一直的读取数据
    public ReaderThread(Socket socket, Server2 server2){
        try {
            inputStream = socket.getInputStream();
            this.server2 = server2;
        }catch (IOException e){
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        super.run();
        System.out.println("ReaderThread线程已经开启。。。");
        try{
            int len = 0;
            byte[] bytes = new byte[1024];
            while((len = inputStream.read(bytes)) != -1){
                server2.sendMessageToAllUser(new String(bytes,0,len));
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

客户端:

package com.wx.socket;

import sun.reflect.generics.scope.Scope;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TcpClient{
    //定义一个Socket对象
    Socket socket = null;
    public TcpClient(String host,int port){

        try {
            //需要服务器的ip地址和端口号,才能获得正确的Socket对象
            socket = new Socket(host,port);
            new SendMessThread(socket).start();
            int len = 0;
            byte[] bytes = new byte[1024];
            while((len = socket.getInputStream().read(bytes))!=-1){
                System.out.println("客户端接收服务端请求:"+new String(bytes,0,len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        //定义主机号
        String host = "localhost";
        //定义端口号
        int port = 8808;
        TcpClient tcpClient = new TcpClient(host,port);

    }
}

客户端给服务器端发送消息线程

package com.wx.socket;

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

public class SendMessThread extends Thread{
    Socket socket = null;
    public SendMessThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        super.run();

        OutputStream outputStream = null;
        try {
            outputStream = socket.getOutputStream();
            Scanner scanner = new Scanner(System.in);
            String in = "";
            do{
                in = scanner.next();
                outputStream.write(in.getBytes());
                outputStream.flush();
            }while(!"byte".equals(in));
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!