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

问题描述

有关于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();
            }
        }
    }
}

}

时间: 2024-09-14 00:28:49

网络编程-有关于Socket的问题,简单的服务器程序与客户程序之间的通信的相关文章

C# 网络编程之使用Socket类Send、Receive方法的同步通讯

      经过几天学习,终于解决了再C#网络编程中使用Socket类Send和Receive方法开发的客户端和服务端的同步通讯程序:实现了又客户端想服务器发送消息的界面程序.主要使用的方法是:      1.Socket套接字编程的知识,通过IPAddress定义一个IP地址,IPEndPoint定义一个主机,Socket实例套接字对象sock和线程Thread的的成员变量;      2.再调用方法bind绑定端口.listen监听端口.accept接受连接请求.connect请求连接来连接

Java网络编程基础(二) Socket类的使用方法

当客户程序需要与服务器程序通讯的时候,客户程序在客户机创建一个socket对象,Socket类有几个构造函数. 两个常用的构造函数是 Socket(InetAddress addr, int port) 和 Socket(String host, int port),两个构造函数都创建了一个基于Socket的连接服务器端流套接字的流套接字.对于第一个InetAddress子类对象通过addr参数获得服务器主机的IP地址,对于第二个函数host参数包被分配到InetAddress对象中,如果没有I

请问各位,在C#网络编程中,如果要实现不在一个局域网内的两台电脑的通信,我该怎么实现?

问题描述 请问各位,在C#网络编程中,如果要实现不在一个局域网内的两台电脑的通信,我该怎么实现?初学者的问题,谢谢了 解决方案 解决方案二:没有人,自己顶起来解决方案三:不能沉啊,自己顶起来,拜托各位大侠了解决方案四:你可以了解下NAT穿透

从零开始学Python第八周:详解网络编程基础(socket)_python

一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 套接字是一个双向的通信信道的端点.套接字可能在沟通过程,进程之间在同一台机器上,或在不同的计算机之间的进程 要创建一个套接字,必须使用Socket模块的socket.socket()方法 在socket模块中的一般语法: s = socket.socket(sock

Python网络编程学习:Socket基础

1. Socket基础 客户端与服务器连接有两种方式:TCP和UDP,TCP是面向连接的方式(三次握手.四次挥手等),可靠但耗资源,而UDP采用无连接方式,不可靠但速度快.这里面的学问很多,但大部分人知道这些就足够了 2. 一个简单的TCP例子(阻塞方式) 不管是Python还是其它语言,Socket编程几乎都有一个固定模板,下面看一个简单例子,用于计算阶乘和,比如客户端发送5,服务器端返回5!+4!+3!+2!+1!. Server端Python代码: import socket sock =

iOS网络编程-iOS中Socket编程介绍

使用Socket进行C/S结构编程,连接过程   服务器端监听某个端口是否有连接请求.服务器端程序处于堵塞状态,直到客户端向服务器端发出连接请求,服务器端接受请求程序才能向下运行.一旦连接建立起来,通过Socket可以获得输入输出流对象.借助于输入输出流对象就可以实现与客户端的通讯,最后不要忘记关闭Socket和释放一些资源(包括:关闭输入输出流). 客户端流程是先指定要通讯的服务器IP地址.端口和采用的传输协议(TCP或UDP),向服务器发出连接请求,服务器有应答请求之后,就会建立连接.之后与

网络编程-c++的socket编程,无客户端连接accept却不阻塞,直接返回了,怎么解决

问题描述 c++的socket编程,无客户端连接accept却不阻塞,直接返回了,怎么解决 以下是服务端的代码: #include "stdafx.h" #include "winsock2.h" #include "iostream" #pragma comment (lib,"ws2_32") using namespace std; int _tmain(int argc, _TCHAR* argv[]) { WSADA

[网络编程]-请教关于Socket.BeginReceive的正确用法!?

问题描述 最近在实现一个简易的网关服务器,首先尝试着用FlyTCP来实现.碰到了一些疑惑.TcpSvr中,accept到客户端之后,调用BeginReceive(buffer,....);他这里用到的buffer是通用的(每个监听并接受的客户端都用这个buffer来receive).但是我当初理解的是,这个是异步多线程的,得每个客户端分配一个buffer.网上看到有些文章确实是一个客户端分配一个buffer.问题来了:1.那FlyTCP这里面意思是不是,某一瞬间只可能收到一玩家的消息?而后面其他

c#网络编程-求c# socket聊天程序源码

问题描述 求c# socket聊天程序源码 我用c# winform自己写了一个局域网通信的软件,但是有点问题.求源码,类似QQ那样的,但我只要能实现在局域网聊天就行!! 解决方案 http://www.newxing.com/Code/CSharp/SOCKET_62.html 解决方案二: http://blog.csdn.net/liuwenqiangcs/article/details/7485950http://www.cnblogs.com/guoyiqi/archive/2011/