Java Socket 通信之多线程

一、简单的客户端与服务器交互(客户端向服务器发送数据,服务器将数据再返回给客户端)

服务端

* 1、创建服务器 指定端口 ServerSocket(int port)
* 2、接收客户端连接 阻塞时
* 3、发送数据
* 接收多个客户端

Mulityserver.java

package cn.Tcp;
/*
 * 服务端
 * 1、创建服务器 指定端口   ServerSocket(int port)
 * 2、接收客户端连接   阻塞时
 * 3、发送数据
 * 接收多个客户端
 */
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Mulityserver {
    public static void main(String[] args) throws IOException {
        //1、创建服务器 指定端口   ServerSocket(int port)
        ServerSocket server=new ServerSocket(8488);
        //2、接收客户端连接   阻塞时
        while(true) {  //死循环  一个accept() 一个客户端
            Socket socket=server.accept();
            System.out.println("一个客户端建立连接");
            //3、发送数据
            String msg="欢迎使用";
            //输出流

            DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
            dos.writeUTF(msg);
            dos.flush();
        }
    }
}

客户端

Client.java

package cn.Tcp;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException {
        //1、创建客户端 必须指定服务器+端口 此时就在连接
        Socket client=new Socket("localhost",8488);
        //2、接收数据
        DataInputStream dis =new DataInputStream(client.getInputStream());
        String     echo=dis.readUTF();
        System.out.println(echo);

    }
}

效果:

二、多线程实现客户端与服务器端交互(客户端不断的发送,服务器不断的返回)

1)关闭流的方法

CloseUtil.java

package chatdemo02;

import java.io.Closeable;
import java.io.IOException;

/*
 * 关闭流的方法
 */
public class CloseUtil {
    public static void closeAll(Closeable... io) {
        for(Closeable temp:io) {
                try {
                    if(null!=temp) {
                    temp.close();
                }
                }    catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();

            }
        }
    }
}

2)发送数据的线程

Send.java

package chatdemo02;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

/*
 * 发送数据  线程
 */
public class Send implements Runnable {
    //控制台输入流
    private BufferedReader console;
    //管道输出流
    private DataOutputStream dos;
    //控制线程
    private boolean isRunning=true;

    public Send() {
        console=new BufferedReader(new InputStreamReader(System.in));

    }
    public Send(Socket client) {
        this();
        try {
            dos=new DataOutputStream(client.getOutputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            isRunning=false;
            CloseUtil.closeAll(dos,console);
        }
    }

    private String getMsgFromConsole() {
        try {
            return console.readLine();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "";
    }
/*
 * 1、从控制台接收数据
 * 2、发送数据
 */
    public void send() {
        String msg=getMsgFromConsole();
        if(null!=msg&&  !msg.equals("")) {
            try {
                dos.writeUTF(msg);
                dos.flush();   //强制刷新
            } catch (IOException e) {
                // TODO Auto-generated catch block
                isRunning=false;
                CloseUtil.closeAll(dos,console);

            }
        }
    }
    @Override
    public void run() {
        // 线程体
        while(isRunning) {
            send();
        }
    }

}

3)接收数据的线程

Receive.java

package chatdemo02;
/*
 * 接收线程
 */

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

public class Receive implements Runnable {
    //输入流
    private DataInputStream dis;
    //线程标识
    private boolean isRunning=true;

    public Receive() {

    }

    public Receive(Socket client) {
        try {
            dis=new DataInputStream(client.getInputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            isRunning=false;
            CloseUtil.closeAll(dis);
        }
    }

    /*
     * 接收数据
     */
    public String receive() {
        String msg="";
        try {
            msg=dis.readUTF();

        } catch (IOException e) {
            //e.printStackTrace();
            isRunning=false;
            CloseUtil.closeAll(dis);

        }
        return msg;
    }

    @Override
    public void run() {
        //线程体
        while(isRunning) {
            System.out.println(receive());
        }
    }

}

4)服务端

Server.java

package chatdemo02;

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

/*
 * 创建服务器
 * 写出数据 :输出流
 * 读取数据:输入流
 */
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server=new ServerSocket(9999);
        Socket client=server.accept();

        //写出数据
        //输入流
        DataInputStream dis=new DataInputStream(client.getInputStream());
        String msg=dis.readUTF();
        System.out.println(msg);

        //输出流
        DataOutputStream dos=new DataOutputStream(client.getOutputStream());
        dos.writeUTF("服务器----->"+msg);
        dos.flush();
    }
}

5)客户端

Client.java

package chatdemo02;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

/*
 * 创建客户端  :发送数据+接收数据
 * 写出数据 :输出流
 * 读取数据:输入流
 * 输入流输出流在同一个线程内应该独立处理
 *
 *
 *
 */
public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket client=new Socket("localhost",9984);
        //控制台输入流
        new Thread(new Send(client)).start();   //一条路径
        new Thread(new Receive(client)).start(); 

    }

}

运行 Server.java    Client.java   效果如下:

原文地址:https://www.cnblogs.com/ssxblog/p/11272666.html

时间: 2024-11-07 06:57:17

Java Socket 通信之多线程的相关文章

java socket通信-传输文件图片--传输图片

ClientTcpSend.java   客户端发送类 package com.yjf.test; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.InetSocketAddress; import java.net.Socket; public class ClientTcpSend { public static String clien

java Socket通信使用BufferedReader和BufferedWriter的注意事项

注意事项:readLine()要求有换行标识,write()要输出换行标识,要调用flush()刷新缓冲区. 以下是取自java socket通信中的一小段代码. BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.get

【Java】Java Socket 通信示例

用socket(套接字)实现客户端与服务端的通信. 这里举两个例子: 第一种是每次客户端发送一个数据,服务端就做一个应答.(也就是要轮流发) 第二种是客户端可以连续的向服务端发数据,服务端也可以连续向客户端发数据.(多线程) 为了方便起见,客户端服务端都放在一个主机上,分别开两个进程[哈哈,进程间通信lol~] PS: 一个聊天程序雏形 代码也放在GitHub上了:https://github.com/MummyDing/socketChatDemo Demo 1: 简单的Socket通信,一人

【Java】Java Socket 通信演示样例

用socket(套接字)实现client与服务端的通信. 这里举两个样例: 第一种是每次client发送一个数据,服务端就做一个应答. (也就是要轮流发) 另外一种是client能够连续的向服务端发数据,服务端也能够连续向client发数据.(多线程) 为了方便起见,client服务端都放在一个主机上.分别开两个进程[哈哈,进程间通信lol~] PS: 一个聊天程序雏形 代码也放在GitHub上了:https://github.com/MummyDing/socketChatDemo Demo

Delphi Socket通信及多线程编程总结

http://cxhblog.blog.sohu.com/41930676.html 一.Socket通信: Delphi在ScktComp单元中对WinSock进行了封装,该单元提供了TAbstractSocket.TClientSocket.TClientWinSocket.TCustomSocket.TCustomWinSocket.TCustomServerSocket .TServerClientThread.TServerWinSocket.  TServerClientWinSoc

Java Socket通信实现私聊、群聊

前言 闲言少叙,上代码! 代码编写 server服务端 /** * 服务端 */ public class Server { private static ServerSocket server = null; private static Socket ss = null; /** * 客户端集合 */ private static Map<String, ServerThread> serverThreadMap = new HashMap<String, ServerThread&

java Socket通信,客户端与服务端相互发消息

1.通信过程 网络分为应用层,http.ssh.telnet就是属于这一类,建立在传输层的基础上.其实就是定义了各自的编码解码格式,分层如下: 2.Socket连接 上述通信都要先在传输层有建立连接的基础上才能完成,TCP通过三次握手建立连接:   Socket与http的区别可以看下这个: https://www.cnblogs.com/meier1205/p/5971313.html 还有搜索:http下午茶 3.JAVA socket 客户端与服务端互发消息 实现结构图:   客户端和服务

Java Socket通信介绍及可能遇到的问题解决_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 前言 本文主要给大家介绍了关于Java中Socket通信的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. Java中基于TCP协议实现网络通信的两个类:客户端的Socket和服务器端的ServerSocket. Socket通信模型如图所示: 不管Socket通信的功能有多复杂,任何socket通信过程的基本结构都是一样的. 其基本步骤为: ①分别在客户端和服务器端创建Socket和Ser

java socket通信:聊天器(1)

目的:实现多个客户之间的通信 首先,这个聊天器的框架是这样的: 对于服务器端:建立socket,连接到服务器,并且开始监听. import java.io.*; import java.util.ArrayList; import java.util.List; import java.net.*; public class MultiTalkServer{ static int clientnum = 0; //创建一个arraylist数组来保存socket, public static L