该服务器一次只能处理一个客户端请求;
p/**
* 利用Socket进行简单服务端与客户端连接
* 这是服务端
*/
public class EchoServer {
  private ServerSocket serverSocket;
  private int port = 8088;
  //利用构造器启动服务器
  public EchoServer()throws Exception{
    serverSocket = new ServerSocket(port);
    System.out.println("服务器已启动!");
  }
  //需要向客户端发送的短信
  private String ehco(String msg){
    return "echo:"+msg;
  }
  //通过Socket对象获取Io输入流出
  private BufferedReader getReader(Socket socket)throws Exception{
    InputStream in = socket.getInputStream();
    //返回一个字符流对象
    return new BufferedReader(new InputStreamReader(in));
  }
  //通过Socket对象获取IO输出流
  private PrintWriter getWriter(Socket socket)throws Exception{
  OutputStream out = socket.getOutputStream();
  //自动刷新
    return new PrintWriter(out,true);
  }
  //服务器对客户端的请求进行处理
  public void service() {
  while(true){
  Socket socket = null;
  try {
    //接收客户端请求,产生socket对象进行通信
    socket = serverSocket.accept();
    System.out.println("获取客户端的url,端口"+socket.getInetAddress()+":"+socket.getPort());
    BufferedReader br = getReader(socket);
    PrintWriter pw = getWriter(socket);
    String msg = null;
    while((msg = br.readLine()) != null){
      //打印客户端消息
      System.out.println("客户端发送过来的消息:"+msg);
      //向客户端写消息
      pw.println(ehco(msg));
      if(msg.equals("bye")){
        break;
      }
  }

  }catch (Exception e){
    e.printStackTrace();
  }
  }
}

  public static void main(String[] args) throws Exception{
    //产生服务器实例,启动服务器
    EchoServer echoServer = new EchoServer();
    echoServer.service();
  }
}

---------------

客户端(单线程的)
public class EchoClient {

private int port = 8088;
private String host = "localhost";
private Socket socket;
//使用构造方法产生Socket实例
public EchoClient()throws Exception{
socket = new Socket(host,port );
}
//根据socket对象产生输出流对象
private BufferedReader getReader(Socket socket)throws Exception{
InputStream in = socket.getInputStream();
return new BufferedReader(new InputStreamReader(in));
}
//根据Socket对象产生输入流对象
private PrintWriter getWriter(Socket socket)throws Exception{
return new PrintWriter(socket.getOutputStream(),true);
}
//客户端处理方法
public void talk(){
try {
BufferedReader br = getReader(socket);
PrintWriter pw = getWriter(socket);
//控制台输入信息
BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
String msg = null;
while((msg = localReader.readLine()) != null){
//pw.write(msg);
//不能使用write()方法,使用write()要加上println,然后flush();
//println方法中包含write()+println()方法,构造时自动刷新;
pw.println(msg);
System.out.println(br.readLine());
if(msg.equals("bye")){
break;
}
}

}catch (Exception e){
e.printStackTrace();
}
}

public static void main(String[] args) throws Exception{
EchoClient client = new EchoClient();
client.talk();
}
}

java网络编程-单线程服务端与客户端通信的更多相关文章

  1. Java网络编程(TCP服务端)

    /* * TCP服务端: * 1.创建服务端socket服务,并监听一个端口 * 2.服务端为了给客户端提供服务,获取客户端的内容,可以通过accept方法获取连接过来的客户端对象 * 3.可以通过获 ...

  2. java http post/get 服务端和客户端实现json传输

    注:本文来源于<java http post/get 服务端和客户端实现json传输> 最近需要写http post接口所以学习下. 总的还是不难直接上源码! PostHttpClient ...

  3. Netty 学习(二):服务端与客户端通信

    Netty 学习(二):服务端与客户端通信 作者: Grey 原文地址: 博客园:Netty 学习(二):服务端与客户端通信 CSDN:Netty 学习(二):服务端与客户端通信 说明 Netty 中 ...

  4. C#Winform窗体实现服务端和客户端通信例子(TCP/IP)

    Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...

  5. Java网络编程:QQ邮件发送客户端程序设计

    目录 一.目标介绍 1.认识SMTP(邮件传输协议) 2.POP3(邮件接收协议) 二.基于Base64编码邮箱及授权码 1.开通QQ邮箱SMTP/POP3服务 2.Java编写BASE64编码程序 ...

  6. Java的oauth2.0 服务端与客户端的实现

    oauth原理简述 oauth本身不是技术,而是一项资源授权协议,重点是协议!Apache基金会提供了针对Java的oauth封装.我们做Java web项目想要实现oauth协议进行资源授权访问,直 ...

  7. (C#:Socket)简单的服务端与客户端通信。

    要求:1.可以完成一对一的通信:2.实现服务端对客户端一对多的选择发送:3.可以实现服务端的群发功能:4.可以实现客户端文件的发送: 要点:服务器端:第一步:用指定的端口号和服务器的ip建立一个End ...

  8. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...

  9. java的服务端与客户端通信(1)

    一.理解socket 1.1什么是socket? socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络 ...

随机推荐

  1. Java EntityMapper

    package org.rx.util; import org.rx.common.Func2; import org.rx.common.Action2; import org.rx.common. ...

  2. JVM Optimization

    架构图 基本概念说明 堆(heap):数据存储,对象实例:空间往上增长,线程共享区:大小可通过-Xmx和-Xms配置 新生代(Young Generation):划分为Eden Space和两个Sur ...

  3. c#的默认访问权限

    1.命名空间下的元素的默认访问修饰符 public : 同一程序集的其他任何代码或引用该程序集的其他程序集都可以访问该类型或成员. internal : 同一程序集中的任何代码都可以访问该类型或成员, ...

  4. 入门项目 A1 start

    ''' 启动文件入口 ''' from core import src import os import sys # 拿到项目的路径 path = os.path.dirname(__file__) ...

  5. 【转载】 强化学习(十)Double DQN (DDQN)

    原文地址: https://www.cnblogs.com/pinard/p/9778063.html ------------------------------------------------ ...

  6. s21day09 python笔记

    s21day09 python笔记 一.三元运算(三目运算) 用途:用于简单的if条件语句 基本结构 v = 前面 if 条件 else 后面 #如果条件为真,v = 前面,否则,v = 后面 &qu ...

  7. Linux搭建bugfree

    1.xampp安装包地址: 链接:https://pan.baidu.com/s/1Th2QvF77jvIGzMROoF2rbg 密码:yoar 2.因为我用的是xshell5连接Linux服务器,直 ...

  8. python gevent自动挡的协程切换。

    import gevent def func(): print('running func 111')#第一步运行 gevent.sleep(2)#切换到下个协程 print('running fun ...

  9. tgp助手开启逆战游戏无反应

    tgp助手开启逆战游戏无反应(一直显示正在运行游戏)就是没有游戏的登录界面 解决的一些方法(不一定有效): 检查显卡的驱动 检查游戏文件是否损坏 检查是否开启的防护软件程序

  10. DevExpress中barManager下的toolbar如何在panel中显示

    如题,我的Dev Toolbar需要在一个pannel中显示,并且居于最顶部.可是好像默认情况下toolbar都是在窗体的最顶部的,如何设置才能使其位于一个panel的最顶部呢? 解决方案:经过测试, ...