服务器

package com.test;
import java.io.IOException;
import java.net.*;
import java.io.*;
public class MyServer { public static void main(String[] args) {
// TODO Auto-generated method stub
MyServer ms = new MyServer();
}
public MyServer(){
try {
//服务器用ServerSocket对象创建 参数代表的是在9999端口上监听
System.out.println("服务器在9999端口等待监听...");
ServerSocket ss = new ServerSocket(9999);
//等待监听 accept() 方法返回的是Socket对象
Socket s = ss.accept();
//接收客户端输入的数据
InputStreamReader isr =new InputStreamReader(s.getInputStream());
BufferedReader br = new BufferedReader(isr);
//接收控制台输入的数据
InputStreamReader isr2 =new InputStreamReader(System.in);
BufferedReader br2 = new BufferedReader(isr2);
//想客户端写入输出流
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
while(true){
String infoFromClient = br.readLine();
if(infoFromClient.equals("exit"))
{
System.out.println("结束对话!");
s.close();
break;
}
System.out.println("客户端说:"+infoFromClient);
System.out.println("请输入您想对客户端说的话:");
String info = br2.readLine();
pw.println(info);
} } catch (IOException e) {
e.printStackTrace();
} } }

客户端

package com.test;
import java.net.*;
import java.io.*;
public class MyClient { public static void main(String[] args) {
// TODO Auto-generated method stub
MyClient mc = new MyClient();
}
public MyClient(){
try {
//创建客户端连接通道对象 第一个参数表示连接服务器的ip 第2个参数表示连接哪个端口
Socket s = new Socket("127.0.0.1",9999);
//向服务器发送数据 创建写对象 向通道对象的输出流写入数据 true代表及时刷新数据
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
//创建一个输入流 接收从控制台输入的数据
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr); InputStreamReader isr2 = new InputStreamReader(s.getInputStream());
BufferedReader br2 = new BufferedReader(isr2); while(true){
System.out.println("请输入您想对服务器说的话:");
String infoFromControl = br.readLine(); pw.println(infoFromControl);
if(infoFromControl.equals("exit"))
{
System.out.println("对话结束!");
s.close();
break;
}
String info = br2.readLine();
System.out.println("服务器说:"+info); }
} catch (Exception e) {
e.printStackTrace();
} } }

需要注意的地方是,当退出对话判断客户端判断要在想服务端发送数据后判断 不然 服务器没接收到  客户端就关闭了 在这里从两个地方读取数据流 一个是s通道  另一个从控制台读取数据流

Socket编程半双工的更多相关文章

  1. socket编程原理

    socket编程原理 1.问题的引入 1) 普通的I/O操作过程: UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-rea ...

  2. linux网络编程之socket编程(十六)

    继续学习socket编程,今天的内容会有些难以理解,一步步来分解,也就不难了,正入正题: 实际上sockpair有点像之前linux系统编程中学习的pipe匿名管道,匿名管道它是半双工的,只能用于亲缘 ...

  3. 【VS开发】socket编程原理

    socket编程原理 1.问题的引入 1) 普通的I/O操作过程: UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-rea ...

  4. Linux下的C Socket编程 -- server端的继续研究

    Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...

  5. java socket编程(li)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以 ...

  6. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  7. Linux下的C Socket编程 -- server端的简单示例

    Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...

  8. Linux下的C Socket编程 -- 获取对方IP地址

    Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...

  9. Linux下的C Socket编程 -- 简介与client端的处理

    Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...

随机推荐

  1. Python之路-Python中的模块与包

    一.模块简介 在实际开发中我们不可能不用到系统的标准模块,或第三方模块. 如果想实现与时间有关的功能,就需要调用系统的time模块.如果想实现与文件和文件夹有关的操作,就需要要用到os模块. 每一个 ...

  2. Java REST Client API

    https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.3/java-rest-high-supported-apis.htm ...

  3. CSP-S2019 停课日记

    前言 不想上文化课,于是就停课了 (雾) \(10.13\) 停课前一天 今天名义上是放假,所以不算停课. 老师和同学们听说我要停课,都十分的不舍.我啥也没说就悄悄溜到一中来了. \(10.14\) ...

  4. 外媒:Apple面临着印度iPhone的停用

    据外媒报道:印度电信管理局(TRAI)制定遏制令人讨厌的消息的新规则可能导致印度数百万部iPhone的停用. 该监管机构本周早些时候宣布了“2018年电信商业通信客户偏好规定”,根据该规定,它已提议“ ...

  5. 策略模式优化过多的IF ELSE

    前言: 当if else的条件少的话,代码可阅读性及逻辑不影响阅读和扩展.一旦if else过多的话会导致逻辑比较混乱,不易扩展并且很容易出错. 实现方案: 1.定义一个@HandlerType注解, ...

  6. 【CF1255A】Changing Volume【思维】

    题意:每次可以-5/-2/-1/+1/+2/+5,问是否存在方案使得A变成B 题解:首先我们可以设A<B,若A>B,则交换AB,因为A到B和B到A是互逆的过程,所以可以交换 其次将B-=A ...

  7. drawChild中画阴影,裁剪出圆角

    我们在EasyConstraintLayout中初始化paint,并且关闭硬件加速,然后在drawChild中实现阴影逻辑,最终代码如下. public class EasyConstraintLay ...

  8. php 标准库之ArrayObject

    以下为ArrayObject的常用函数: ArrayIterator::current( void ) //返回当前数组元素 ArrayIterator::key(void) //返回当前数组key ...

  9. Anaconda在Python3和Python2之间切换,Conda命令,anaconda中python的升级和降级

    当在pycharm IDE中指定不同的Python版本时,设置方法 File->Setting->Project:XXXX->Project Interpreter    选择不同位 ...

  10. win10下VMware15运行ubuntu18.04无法和主机之间复制粘贴问题

    可以运行以下命令行: sudo apt-get autoremove open-vm-tools sudo apt-get install open-vm-tools sudo apt-get ins ...