import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;
 
class Server extends Thread
{
    private BufferedReader in = null;
    private PrintWriter out = null;
    private Socket socket = null;
    public static int count=0;
    public JabberClient dangQianClient=null;
    Scanner sc = new Scanner(System.in);
 
    class JieShou extends TimerTask
    {
 
        String temp = null;
 
        public void run()
        {
            try
            {temp = in.readLine();
            if(temp!=null)    
 
                System.out.println(temp);
 
            } catch (Exception e)
            {System.out.println( e.getMessage());
            }
        }
    }
 
    public Server(Socket socket) throws IOException
    {
 
        this.socket = socket;
        System.out.println("有一个新的客户端连接"+socket);
        System.out.println("当前的客户端数目: "+ ++count);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new PrintWriter(new BufferedOutputStream(socket.getOutputStream()), true);
        Timer timer = new Timer();
        timer.schedule(new JieShou(), 100, 300);
        this.start();//开始线程
    }
 
    public void run()
    {
        while (true)
        {
            String temp=sc.next();//将此写到线程内,可与当前连接客户端对话  但是 并不能知道连接的是哪个客户端
             out.println("服务器: " + temp);
        }
 
 
    }
}
 
public class MultiJabberServer
{
 
    public static final int port = 8080;
 
    public static void main(String[] args) throws IOException
    {
 
        InetAddress addr=InetAddress.getLocalHost();
        System.out.println(addr.getHostAddress());
        ServerSocket serverSocket = new ServerSocket(port);
        try
        {
            while (true)
            {
 
                Socket socket = serverSocket.accept();//循环等待客户端连接
                try
                {
                    new Server(socket);//有一个客户端连接即开始一个新的线程与客户端通信  然后继续等待客户端的连接请求
                } catch (Exception e)
                {
                    socket.close();
                }  
            }
        } finally
        {
            serverSocket.close();
            System.exit(0);
        }
    }
 
}
 
 
 
 
 

基于TCP协议的服务器(多线程)的更多相关文章

  1. 基于TCP协议的服务器(单线程)

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import  ...

  2. 基于TCP协议的客户端

    基于TCP协议的客户端 此客户端能用于下一篇博客的单线程服务器和多线程服务器 import java.io.BufferedReader; import java.io.IOException; im ...

  3. 基于TCP协议的项目架构之Socket流传输的实现

    项目背景  某银行的影像平台由于使用时间长,服务器等配置原因,老影像系统满足不了现在日益增长的数据量的需求,所以急需要升级改造.传统的影像平台使用的是Oracle数据库和简单的架构来存储数据(视频.图 ...

  4. 基于Tcp协议的简单Socket通信实例(JAVA)

    好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. ...

  5. (1)线程的同步机制 (2)网络编程的常识 (3)基于tcp协议的编程模型

    1.线程的同步机制(重点)1.1 基本概念 当多个线程同时访问同一种共享资源时可能会造成数据的覆盖和不一致等问题,此时就需要对线程之间进行协调和通信,该方式就叫线程的同步机制. 如: 2003年左右 ...

  6. (1)基于tcp协议的编程模型 (2)tcp协议和udp协议的比较 (3)基于udp协议的编程模型 (4)反射机制

    1.基于tcp协议的编程模型(重中之重)1.1 编程模型服务器: (1)创建ServerSocket类型的对象,并提供端口号: (2)等待客户端的连接请求,调用accept()方法: (3)使用输入输 ...

  7. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  8. 浅析C#基于TCP协议的SCOKET通信

    TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实 ...

  9. 用c++开发基于tcp协议的文件上传功能

    用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...

随机推荐

  1. NPOI_2.1.3-Excel中设置小数、百分比、货币、日期、科学计数法和金额大写

    在操作Excel时候一些特殊值的转换是在所难免的,下面就给出转换方法大同小异,代码如下: HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); ISheet ...

  2. Licode Install CentOS 7.0

    mysqldump --add-drop-table -uroot -p123456 jit >/extra_disk/jit.sql sudo npm install -g node-gyp ...

  3. C/C++易错点

    问:void print( int arr[][], int size );这个函数声明是对是错? 当然是错的了,这个根本不是什么函数声明的问题,而是数组声明的问题,int arr[][]这个声明就是 ...

  4. 面试题:实现LRUCache::Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...

  5. SQL 多条件查询

    网上有不少人提出过类似的问题:“看到有人写了WHERE 1=1这样的SQL,到底是什么意思?”.其实使用这种用法的开发人员一般都是在使用动态组装的SQL.让我们想像如下的场景:用户要求提供一个灵活的查 ...

  6. 一个matlab数字图像处理程序的解释

    clc; %clc是清除command window里的内容 clear all; %clear是清除workspace里的变量 close all; %close all来关闭所有已经打开的图像窗口 ...

  7. swift 与 OC 混合编程

    原文地址:http://www.cocoachina.com/swift/20150608/12025.html 一.解决问题 Swift项目需要使用封装好的Objective-c组件.第三方类库,苹 ...

  8. NCPC 2012 Cookie Selection

    题目要求每次输出中间的那个数,如果数据很大肯定扛不住: 所以用两个优先队列来维护: 这样的话中间的那个数反正会在两个队列的任何一个的头部: 时间复杂度肯定比较小: 代码: #include <c ...

  9. websql

    http://blog.darkcrimson.com/2010/05/local-databases/ http://www.oschina.net/question/12_26204 webkit ...

  10. Unreal Engine4 蓝图入门

    微信公众号:UE交流学习    UE4开发群:344602753 蓝图是Unreal Engine的特点,用C++编程固然好,但是效率要低很多,主要是国内资料比较少,所以不太容易学习,用蓝图编程可以节 ...