java多线程实现多客户端socket通信

一、服务端

package com.czhappy.hello.socket;

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

public class Server {
    public static void main(String[] args) {
        //创建ServerSocket示例,指定端口,侦听
        try {
            ServerSocket serverSocket = new ServerSocket(8888);
            System.out.println("服务即将启动,等待客户端连接");
            //记录客户端的数量
            int count = 0;
            Socket socket = null;
            while(true){
                //开始监听,等待客户端的连接
                socket = serverSocket.accept();
                ServerThread serverThread = new ServerThread(socket);
                serverThread.start();
                count++;
                System.out.println("客户端的数量="+count);
                InetAddress address = socket.getInetAddress();
                System.out.println("当前客户端的IP地址为:"+address.getHostAddress());
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
package com.czhappy.hello.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.io.UnsupportedEncodingException;
import java.net.Socket;

/**
 * 服务器线程处理类
 * @author Administrator
 *
 */
public class ServerThread extends Thread{

    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;
        try {
            //获取字节输入流
            is = socket.getInputStream();
            //将字节输入流转化为字符输入流
            isr = new InputStreamReader(is, "utf-8");
            //为字符输入流添加缓冲
            br = new BufferedReader(isr);
            String data = br.readLine();
            while(data!=null){
                System.out.println("我是服务器,客户端说:"+data);
                data = br.readLine();
            }
            //关闭输入流
            socket.shutdownInput();
            //获取输出流,响应客户端请求
            os = socket.getOutputStream();
            pw = new PrintWriter(os);
            pw.write("欢迎您!");
            pw.flush();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                if(pw!=null){
                    pw.close();
                }
                if(os!=null){
                    os.close();
                }
                if(br!=null){
                    br.close();
                }
                if(isr!=null){
                    isr.close();
                }
                if(is!=null){
                    is.close();
                }
                if(socket!=null){
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

}

二、客户端

package com.czhappy.hello.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;

public class Client {

    public static void main(String[] args) {
        try {
            //创建客户端Socket,指定服务器地址和端口
            Socket socket = new Socket("192.168.0.45", 8888);
            //获取输出流,向服务器发送消息
            OutputStream os = socket.getOutputStream();//字节输出流
            PrintWriter pw = new PrintWriter(os);//将输出流包装成打印流
            pw.write("用户名:admin;密码:123");
            pw.flush();
            socket.shutdownOutput();//关闭输出流
            //获取输入流,读取服务器端响应信息
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String data = br.readLine();
            while(data!=null){
                System.out.println("我是客户端,服务器说:"+data);
                data = br.readLine();
            }

            br.close();
            is.close();
            pw.close();
            os.close();
            socket.close();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

三、测试结果

需要先启动服务端,再启动客户端

服务端运行结果:

客户端运行结果:

原文地址:https://www.cnblogs.com/chenzheng8975/p/9579901.html

时间: 2024-10-06 17:23:19

java多线程实现多客户端socket通信的相关文章

Java与C之间的socket通信

最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少,而且后台服务器已经采用原始socket实现与c客户端通信,这就要求Android客户端也采用socket实现.所以在开发Android app时采用了原始socket进行编程. 由于算法是用C语言实现的,而Android应用一般是Java开发,这就不可避免得涉及Java和C语言之间的通信问题.一种

Java多线程-同步:synchronized 和线程通信:生产者消费者模式

大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同步:synchronized 多个线程同时访问一个对象,可能造成非线程安全,数据可能错误,所谓同步:就是控制多个线程同时访就是控制多线程操作同一个对象时,注意是同一个对象,数据的准确性, 确保数据安全,但是加入同步后因为需要等待,所以效率相对低下. 如:一个苹果,自己一个人去咬怎么都不会出问题,但是

Java Socket应用(七)——使用多线程实现多客户端的通信

转载请注明:http://blog.csdn.net/uniquewonderq 问题:一个服务端可以跟多个客户端通讯 基本步骤: 1.服务器端创建ServerSocket方法,循环调用accept()方法等待客户端连接 2.客户端创建socket和服务的请求连接 3.服务端接受客户端的请求,建立专线连接 4.建立连接的两个socket在一个单独的线程上对话 5.服务器端继续等待新的连接 创建一个服务器相关的线程类: package com.test; import java.io.Buffer

Java多线程中线程间的通信

一.使用while方式来实现线程之间的通信 package com.ietree.multithread.sync; import java.util.ArrayList; import java.util.List; public class MyList { private volatile static List list = new ArrayList(); public void add() { list.add("apple"); } public int size() {

java服务器端与android客户端的通信

服务器端的工作非常简单,建立socket.监听,代码如下: package com.hdc.socket; import java.io.IOException; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class JavaServer { public static void main(String[] args) { try { ServerSocket

java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)

本篇我们将讨论以下知识点: 1.线程同步问题的产生 什么是线程同步问题,我们先来看一段卖票系统的代码,然后再分析这个问题: [java] view plain copy print? package com.zejian.test; /** * @author zejian * @time 2016年3月12日 下午2:55:42 * @decrition 模拟卖票线程 */ public class Ticket implements Runnable { //当前拥有的票数 private 

Delphi和JAVA用UTF-8编码进行Socket通信例子

最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码. 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收到是乱码,而我这边(Delphi7,ANSI)收到的数据将utf-8转码成ansi也是乱码. 因为不太熟悉java语言,还曾经怀疑是不是Delphi的utf-8编码和java语言的不一样. 最近学习了一下java的相关知识,写一个小程序来测试验证一下我曾经的怀疑. 事实证明,Delphi7的UTF-

java多线程学习-同步之线程通信

这个示例是网上烂大街的,子线程循环100次,主线程循环50次,但是我试了很多次,而且从网上找了很多示例,其实多运行几次,看输出结果并不正确.不知道是我转牛角尖了,还是怎么了.也没有大神问,好痛苦.现在记录在这里,等以后有时间看. import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; p

java nio--采用Selector实现Socket通信

server: 1 /** 2 * 选择器服务端 3 * Created by ascend on 2017/6/9 9:30. 4 */ 5 public class SelectorServer { 6 // public final static String REMOTE_IP = "192.168.0.44"; 7 public final static String REMOTE_IP = "127.0.0.1"; 8 public final stat