2 renrenai35 renrenai35 于 2014.02.21 21:49 提问

有关于Socket的问题,简单的服务器程序与客户程序之间的通信

问题是这样的,我写了两个简单 的服务器程序,其中一个与一个简单的客户程序可以连续发多次信息,而另一个则不可以,发一次它就会不能继续再发了,程序并没有停止运行,而是服务器收不到它的信息了,求大侠帮忙看下啦~以下为两个服务器程序代码。因为我用的是同一个客户程序测试,所以跟client无关
吧。

//这个是可以连续发送信息的服务器
package Test20140210;

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.ServerSocket;
import java.net.Socket;

public class EchoServer {
private int port=8001;
private ServerSocket serverSocket;

public EchoServer() throws IOException{
    serverSocket=new ServerSocket(port);
    System.out.println("Server Started .");
}

public String echo(String msg){
    return "echo :" +msg;
}

private PrintWriter getWriter(Socket socket) throws IOException{
    OutputStream socketOut=socket.getOutputStream();
    return new PrintWriter(socketOut,true);
}

private BufferedReader getReader(Socket socket) throws IOException{
    InputStream socketIn=socket.getInputStream();
    return new  BufferedReader(new InputStreamReader(socketIn));
}

public void service(){
    while (true){
        Socket socket=null;
        try{
            socket=serverSocket.accept();                   //等待客户连接
            System.out.println("New connection accepted "+socket.getInetAddress()+" : "+socket.getPort());
            BufferedReader br=getReader(socket);
            PrintWriter pw=getWriter(socket);
            String msg=null;
            while((msg=br.readLine())!=null){
                System.out.println("NEW Line : "+msg);                  //在服务器程序上打印
                pw.println(echo("My message : "+msg));                  //在客户程序上打印
                if(msg.equals("bye"))
                    break;
            }
        }catch(IOException e){
            e.printStackTrace();
        }
        finally{
            try{
                if(socket!=null)
                    socket.close();
            }
            catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

public static void main(String[] args) throws IOException {
    new EchoServer().service();
}

}

//以下这个是不可以连续发的服务器
package Test20140221;

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.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class EchoServer {
private int port = 8001;
private ServerSocket serverSocket;
private ExecutorService executorService;
private final int POOL_SIZE=4;

public EchoServer() throws IOException{
    serverSocket=new ServerSocket(port);
    executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
    System.out.println("numbers of CPU : "+Runtime.getRuntime().availableProcessors());
    System.out.println("Server started.");
}

public void service(){
    while(true){
        Socket socket=null;
        try{
            socket=serverSocket.accept();
            executorService.execute(new Handler(socket));
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}
public static void main(String[] args) throws IOException{
    new EchoServer().service();
}
class Handler implements Runnable{
    private Socket socket;
    public Handler(Socket socket){
        this.socket=socket;
    }
    private PrintWriter getWriter(Socket socket) throws IOException{
        OutputStream socketOut=socket.getOutputStream();
        return new PrintWriter(socketOut); 
    }
    private BufferedReader getReader(Socket socket) throws IOException{
        InputStream socketIn=socket.getInputStream();
        return new BufferedReader(new InputStreamReader(socketIn));
    }
    public String echo(String msg){
        return "echo : "+msg;
    }
    public void run(){
        try{
            System.out.println("New connection accepted"
                    +socket.getInetAddress()+ " : "+socket.getPort());
            BufferedReader br=getReader(socket);
            PrintWriter pw=getWriter(socket);

            System.out.println("this is Handler!");
            String msg=null ;
            while((msg=br.readLine())!=null){
                System.out.println(msg);;
                pw.println(echo(msg));
                if(msg.equals("bye"))
                    break;
            }
        }catch(IOException e ){
            e.printStackTrace();
        }finally{
            try {
                if(socket!=null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Socket编程:TCP客户端/服务器应用程序
客户机/服务器应用程序模型通常被看作是位于远处的,高功率计算装置,其存储大量数据的业务逻辑。而用户界面在相对便宜的机器上由客户端软件进行处理。这种观点有些模糊,因为任何服务机器的请求可能会被称为服务器。尽管服务器等待客户端开始对话,在某些情况下,在同一个程序既可以充当客户端也可以作为服务器。 从这个意义上说,一台机器可以作为网络客户端进行通信,也可经过一个TCP/IP协议栈的层在服务器程序之间进行
文件传输协议的简单设计与实现
1、实验内容 我们的计算机网络实验环境建立在TCP/IP 网络体系结构之上。各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。实验室各计算机具备Windows环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能。本实验要求学生利用这些功能,设计和实现一个简单的文件传送协议。 2、具体要求 用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),该程序应能实现下述命令功能: get:取远方的一个文件 put:传给远方一个文件 pwd:显示远主当前目录 dir:列出远方当前目录 cd :改变远方当前目录 ? :显示你提供的命令 quit :退出返回 这此命令的具体工作方式(指给出结果的形式)可以参照FTP 的相应命令,有余力的同学可以多实现几个命令。 最后,写出实验报告。
Linux下socket编程实现客户机服务器通信的例子
Linux下socket编程实现客户机服务器通信的例子经典的在同一台主机上两个进程或线程之间的通信通过以下三种方法 管道通信(Pipes) 消息队列(Message queues) 共享内存通信(Shared memory) 这里有许多其他的方法,但是上面三中是非常经典的进程间通信。但是你有曾想过怎样跨越两台主机进行通信呢?例如,当你浏览一个网站时,在你的主机上,运行的是你的浏览器,而在远程的系统上
计算机网络课程设计(编写UDP客户/服务器程序)
本设计实现了基于UDP协议的客户端和服务器端的一个简单聊天程序设计。包含客户端和服务器端的源代码及相关截图。
Java中Socket阻塞的原因
Java中Socket阻塞的原因 对于用ServerSocket 及 Socket 编写的服务器程序和客户程序, 他们在运行过程中常常会阻塞. 例如, 当一个线程执行 ServerSocket 的accept() 方法时, 假如没有客户连接, 该线程就会一直等到有客户连接才从 accept() 方法返回. 再例如, 当线程执行 Socket 的 read() 方法时, 如
Unix 网络编程(四)- 典型TCP客服服务器程序开发实例及基本套接字API介绍
写在开头: 在上一节中我们学习了一些基础的用来支持网络编程的API,包括“套接字的地址结构”、“字节排序函数”等。这些API几乎是所有的网络编程中都会使用的一些,对于我们正确的编写网络程序有很大的作用。在本节中我们会介绍编写一个基于TCP的套接字程序需要的一些API,同时会介绍一个完整的TCP客户服务器程序,虽然这个程序功能相对简单,但确包含了一个客户服务器程序所有的步骤,一些复杂的程序也都是在
httpcore-nio-4.3.jar包
用Java实现非阻塞通信 ,用ServerSocket和Socket来编写服务器程序和客户程序,是Java网络编程的最基本的方式。 httpcore-nio-4.3.jar包
用tcp实现连接的一个简单的c++的CS客户端服务器的通讯收发程序
用tcp实现客户机服务器之间的通讯,且服务器可以处理多个客户的连接请求.
关于java socket多用户聊天--图形界面版&带高层架构思想(经典面试题)
这个程序主要是吃透socket的tcp传输协议。另外就是要有要有如下架构思想:在服务器端 用一个HashMap< userName,socket> 维护所有用户相关的信息,从而能够保证和所有的用户进行通讯。 客户端的动作: (1)连接(登录):发送userName 服务器的对应动作:1)界面显示,2)通知其他用户关于你登录的信息, 3)把其他在线用户的userName通知当前用户 4)开启
TCP客户/服务器程序示例
这一章就是就是给了个客户服务器的程序例子,然后围绕这个小例子,可能会出现什么问题,该如何改进,然后就改进了一个又一个的版本。一、TCP客户/服务器的简单版本服务器TCP回射服务器程序:main函数:#include "unp.h"int main(int argc, char **argv) { int listenfd, connfd; pid