该服务器一次只能处理一个客户端请求;
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. Jsの数组练习-求一组数中的最大值和最小值,以及所在位置

    要求:求一组数中的最大值和最小值,以及所在位置 代码实现: <!DOCTYPE html> <html lang="en"> <head> &l ...

  2. AndroidStudio连不上Android设备真机

    AndroidStudio连不上Android设备真机 刚好遇到这个问题,查阅了很多资料,看到有人分享了引起该问题的几个原因,我总结了一下: 1.手机设置问题.开USB调试 方法:手机设置-开发人员调 ...

  3. javascript 统计字符串中每个字符出现的次数

    var str = "abdcadfasfdbadfafdasdfasyweroweurowqrewqrwqrebwqrewqrejwq;;"; // console.log(nu ...

  4. 我在MySQL免安装版使用过程中遇到的问题记录

    我的MySQL版本为:mysql-5.7.16-winx64 安装时间为:2016年5月10号 由于是免安装版,下载好压缩文件之后解压到特定目录下,再打开命令行运行几行命令即可. 在一次操作中,发现无 ...

  5. web(八)CSS选择器

    标签选择器 使用html标签筛选需要渲染的网页元素. 使用场景 修改标签的默认样式,例如ul li 有默认的内边距,开发时应去掉标签的默认样式. 设定全局字体样式. 根据分辨率设定html标签的默认字 ...

  6. 后台获取用户登录token 和获取前端参数方法

    //获取request请求中所有参数 Enumeration<String> names = request.getParameterNames(); HashMap<String, ...

  7. 在vue中使用Echarts画曲线图(异步加载数据)

    现实的工作中, 数据不可能写死的,所有的数据都应该通过发送请求进行获取. 所以本项目的需求是请求服务器获得二维数组,并生成曲线图.曲线图的横纵坐标均从获得的数据中取得. Echarts官方文档: ht ...

  8. vue调用支付接口

    html: <div class="paymentHtml" v-html="paymentHtml"></div> script: d ...

  9. ios-屏幕适配(代码)

    由于第一个项目中98%的界面都用到UITableView,所以适配仅判断此.知道手工敲代码的繁复,遂传一部分,如果有更优的方法,欢迎提出. 如下图,图中提到的宏定义是在prefix.pch预编绎文件里 ...

  10. EBS打补丁参考

    EBS Application打补丁参考:http://blog.csdn.net/cunxiyuan108/article/details/6009784 整体步骤: 0. 停止应用(注意确认FND ...