1.客户端

package Thread;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Click {

    public static void main(String[] args) throws UnknownHostException, IOException {

        Click click=new Click();
        click.start();
    }

    private Socket socket;
    public Click() throws UnknownHostException, IOException {
        socket=new Socket("localhost", 8088);//连接指定的地址和端口

    }

    public void start() throws IOException {
        System.out.println("欢迎你,"+socket.getInetAddress());
        PrintWriter pw=null;
        //创建一条线程读取 服务器端发送过来的信息。
        Thread t=new Thread(new ServerHandler());
        t.setDaemon(true);//守护线程
        t.start();

        try {
            // 输出流,将客户端的消息发送出去
             pw=new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"),true);

             Scanner scan=new Scanner(System.in);
             while(true){
                    pw.println(scan.nextLine());
                    }

        } catch (UnsupportedEncodingException e) {
            System.out.println("io流异常");
        } finally {
            if(socket!=null) {
                socket.close();
            }
        }
    }

    //读取服务端发送的消息
    class ServerHandler implements Runnable{

        public void run() {
            BufferedReader br=null;
            try {
                br=new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
                System.out.println(br.readLine());

            } catch (IOException e) {
                System.out.println("IOException");
            }
        }
    }
}

2.服务端

package Thread;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Server {

    public static void main(String[] args) throws IOException {
        Server server=new Server();
        server.start();
    }

    //成员变量
    private ExecutorService threadPool;
    private ServerSocket serverSocket;
    private List<PrintWriter>allOut;

    public Server() throws IOException {//初始化变量
        serverSocket=new ServerSocket(8088);
        threadPool=Executors.newFixedThreadPool(3);
        allOut=new ArrayList<PrintWriter>();
    }

    public void start() {

        try {
            while(true) {
                System.out.println("等待客户端连接");
            Socket socket=serverSocket.accept();//监听客户端的连接
            //每连接一条线程
            threadPool.execute(new ClickHandler(socket));
            }
        } catch (IOException e) {
            System.out.println("socket Exection");
        }
    }

    class ClickHandler implements Runnable{
        private Socket socket;
        public ClickHandler(Socket socket) {
            this.socket=socket;
        }
        //线程同步
        public synchronized void addOut(PrintWriter pw) {
            allOut.add(pw);
        }
        public synchronized void pwClose(PrintWriter pw) {
            pw.close();
        }

        public void run() {

            BufferedReader br;
            PrintWriter pw=null;
            try {
                System.out.println(socket.getInetAddress()+"连接成功");
                br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
                //使用输出流将信息发到客户端
                 pw=new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"), true);
                addOut(pw);
                String message=null;
                while((message=br.readLine())!=null) {
                        for(PrintWriter p:allOut) {
                            if(p!=pw) {
                                p.println(socket.getInetAddress()+":"+message);
                            }
                        }
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                pwClose(pw);
                if(socket!=null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }

        }
    }

}

end

Socket通讯的简单用法的更多相关文章

  1. erlang和java的socket通讯----最简单,初次实现。

    直接上源码,留做纪念. 有点简单,大家不要笑,初次实现. 功能描述:java发送数据给erlang,erlang将收到的数据重复两次再发送给java. erlang源码:模块tcp_listen -m ...

  2. 闲来无事,写个基于TCP协议的Socket通讯Demo

    .Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...

  3. 试解析Tomcat运行原理(一)--- socket通讯

    关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...

  4. java socket通讯(一) 入门示例

    一.入门 要想学习socket通讯,首先得知道tcp/ip和udp连接,具体可参考浅谈TCP/IP 和 UDP的区别 二.示例 首先新建了一个java工程,包括两个部分,客户端SocketClient ...

  5. Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯

    Socket网络通讯开发总结之:Java 与 C进行Socket通讯 http://blog.sina.com.cn/s/blog_55934df80100i55l.html (2010-04-08 ...

  6. 利用BlazeDS的AMF3数据封装与Flash 进行Socket通讯

    前几天看到了Adobe有个开源项目BlazeDS,里面提供了Java封装AMF3格式的方法.这个项目貌似主要是利用Flex来Remoting的,不过我们可以利用他来与Flash中的Socket通讯. ...

  7. c#写个基础的Socket通讯

    晚上想写点东西,想想把我刚来公司学的Sockt通讯写上来吧.要写的简单易懂点,新人们可以借鉴下哦,用控制台写. 先得说说Socket,与TCP/UDP啥关系,一直讲什么Socket通讯,TCP通讯,都 ...

  8. Silverlight下的Socket通讯

    http://www.cnblogs.com/chengxingliang/archive/2012/05/24/2515100.html 在Silverlight中进行通讯,只能使用4502-453 ...

  9. 试解析Tomcat运行原理(一)--- socket通讯(转)

    关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...

随机推荐

  1. android侧滑效果(引用官方网站提供的API文件)

    原文地址:http://www.cnblogs.com/android100/p/android-SlidingMenu.html 在新浪微博和唱吧里面都有看到android的侧滑效果,于是想要学习一 ...

  2. Centos 8双网卡设置

    原理:不管开发板是通过直连.路由器还是交换机连接到PC机,最终都是接到PC的以太网网卡(对笔记本来说,一般存在两个网卡,一个WIFI网卡和以太网网卡):因此要实现PC机与虚拟机的互ping,必须把虚拟 ...

  3. Spark技术学院-进去能学到啥?

    Spark技术学院是什么? 主要是浪尖,前腾讯现阿里的大神一起搞的知识分享基地,旨在帮助大家由入门到精通spark,hbase,kafka大数据重要的框架,还有给入门小白指点入门方法,分享入门资料,对 ...

  4. C#与unity中base64string和图片互转

    C#: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...

  5. jrebel插件的激活

    转 jrebel idea插件激活,亲测可用: 在jrebel server处,写上: http://139.199.89.239:1008/88414687-3b91-4286-89ba-2dc81 ...

  6. 【LeetCode】接雨水

    [问题] 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况 ...

  7. C#验证码 使用GDI绘制验证码

    首先展示一下效果图如下: C#中的GDI特别方便,很多方法我们只要简单的调用就可以实现很复杂的功能.具体实现过程如下: 首先创建一个windows窗体应用(测试使用,实际开发winform程序时在需要 ...

  8. VS Code 单文件、多文件(工程) 配置文件

    针对于单文件编译运行,需要在代码文件夹下建立子文件夹 .vscode ,并放置三个文件 1:c_cpp_properties.json,注意更改7.8.11行的路径 { "configura ...

  9. 一百零二、SAP中ALV事件之十五,让ALV表格自动求和

    一.代码如下 二.运行之后,效果如图,表头多了一个求和符号E,最下面一行会列出求和的相关信息 完美

  10. 五十二、SAP中的可编辑表格LVC

    一.之前我们写的表格如下,都是通过WRITE输出,不支持同步编辑等操作,给人感觉非常之LOW 二.在SAP中还存在另外一种可编辑的表格,叫LVC表格,效果如下, 三.此可标记表格是座位SAP内置模块来 ...