Socket是client进行在网络与server进行数据交互的一种基本通信方式。通信有三种通信。即单工。半双工,和全双工。

所谓单工,就是仅仅可以进行单向通信,如bb机。

而半双工就是一来一回的通信方式,如对讲机。

全双工也是最经常使用的,就是现实长连接实时通信。如QQ。

假设理解了上面的三个工作方式,那以下就以半双工为例,分析一下其工作的流程:

首先:在server端建立一个监听端口,没有多么复杂,就相当于一个等待连接的东西。

第二步:这时候,假设在client的话,要想去连接上面的server。就要去用相应的方法发送一个请求。意思是让server把这个端口打开,建立通信。

第三步:server接受到client发送的请求,会建立连接。这个很重要,真正意义上的通信也就開始了。

第四步:上面的连接完毕之后,客服端開始向server端发送相应的数据信息。

第五步:server接收到数据。

第六步:接收到数据之后,进行处理。返回结果。

第七步:客服端接收到结果信息。

总而言之,上面的步骤依照我的总结就是:

连接——–发送数据——-接收数据——处理——返回数据—–client接收—————循环下去。

以下是一个实现半双工的简单实例:

server端:

package test1;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;
public class Server1 { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Server1 ms1=new Server1(); }
public Server1(){
try {
// 实例化
ServerSocket p1=new ServerSocket(9999);
// 等待接收一个连接
Socket s=p1.accept();//返回一个socket连接
// 接收数据
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
String info=br.readLine();
System.out.println("server接收到:"+info);
// server返回数据向client发送
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
pw.println("这是server返回的数据");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

client:

package test1;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException; public class Client1 { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Client1 p2=new Client1();
}
public Client1(){
try {
// 连接某一个server端ip/端口号
Socket s=new Socket("127.0.0.1",9999);
// 发送数据,true是即时刷新
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
pw.println("这是client发送的数据");
// client接收到返回的数据
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
String response=br.readLine();
System.out.println("client收到"+response);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

Socket实现一个简单的半双工通信的更多相关文章

  1. C#socket编程之实现一个简单的TCP通信

    TCP(TransmissionControl Protocol)传输控制协议. 是一种可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送缓存&接收缓存).面向字节流.使用TC ...

  2. socket编程——一个简单的样例

    从一个简单的使用TCP样例開始socket编程,其基本过程例如以下: server                                                  client ++ ...

  3. socket计划——一个简单的例子

    从一个简单易用TCP样品开始socket计划,的基本过程例如下列: server                                                  client +++ ...

  4. socket编程——一个简单的例子

    从一个简单的使用TCP例子开始socket编程,其基本步骤如下: server                                                  client ++++ ...

  5. 使用Socket模拟一个简单的Webservice调用

    webservice是对socket的一个封装,让远程调用调用变得更加简单,那么使用socket究竟有多么麻烦呢?来看看. 做一个简单的天气查询: 服务端: public class SocketSe ...

  6. Socket——实现一个简单的静态网页服务器

    整体结构就是使用ServerSocket监听一个地址,当有接受到请求之后,解析请求中的资源路径.服务器资源路径存放在项目下的一个目录中,服务器会到这个目录中根据请求的路径去寻找相应的资源.如果找到了则 ...

  7. socket实现一个简单的echo服务

    服务端的实现: public class EchoServer{ //创建一个serverSocket private final ServerSocket serverSocket; //创建一个构 ...

  8. 用socket写一个简单的客户端和服务端程序

    用来练手写写socket代码 客户端代码 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h ...

  9. 用socket写一个简单的服务器

    import socketsk=socket.socket()sk.bind(("127.0.0.1",7001))sk.listen()def login(url): with ...

随机推荐

  1. 在magento的eav模型中如何在更新记录时只在value表的原值上更新

    1,一般情况下,当我们在调用getModel在load某条实体接着更新对应实体上的值是,都不会覆盖原来的实体value表上的值,而是保留原来的,并在value表上重新创建一条值记录,比如初始表如下: ...

  2. iOS绘图系统UIKit与Core Graphics

    概述 iOS主要的绘图系统有UIKit,Core Graphics,Core Animation,Core Image,Open GL等,本片博文主要介绍UIKit与Core Graphics的绘图系 ...

  3. Java多线程演示样例(模拟通话,sleep,join,yield,wait,notify,Semaphore)

    主线程等待子线程的多种方法 synchronized浅析 sleep 是静态方法,Thread.sleep(xx)谁调用谁睡眠. join 是合并方法.当前线程调用其它线程xx.join()则等到xx ...

  4. Java关键字整理之二

    abstrac和interface 一.抽象类:abstract 抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情.对于一个父 ...

  5. Java笔试面试题001

    Java笔试面试题之中的一个 1.Struts1中actionform和action属于MVC哪一层,为什么? 解答:actionform和action属于MVC的Model层,Action用来处理业 ...

  6. DirectX11 学习笔记1 - 第一个程序

    为了加快学习速度,和使程序更加easy理解.  我把sampler tutorial里面的一个样例 的固定代码和常常修改的代码经过简单的类的封装了一下. 以后学习的时候就能够仅仅在还有一个文件写ren ...

  7. Qt Installer Framework的学习(三)

    Qt Installer Framework的学习(三) Qt Installer Framework的样例中.通常是这种:config目录一般放了一个config.xml文件,包括的是安装配置xml ...

  8. win10怎样开启自带虚拟机

    win10和win8一样.都有自带的虚拟机,可是功能没有一安装上就打开,非常多喜欢用自带的东西,那么win10自带的虚拟机怎样开启呢? 首先要找到控制面板,我们右键点击開始button,我们找到&qu ...

  9. IOC与DI区别

    (1)IOC:控制反转,把对象创建交给spring进行配置. (2)DI:依赖注入,向类里面的属性中设置值. (3)关系:依赖注入不能单独存在,需要在IOC的基础之上完成操作.

  10. php利用反射真正实现多继承(非接口模拟)

    昨天我在写PHP程序的时候,无意发现在PHP的::操作符非常强大,不仅仅是只用在访问parent,sel,静态成员属性.常量上面,其实他的功能强大了去了 . 这个符号在PHP中实际上叫做范围解析符,这 ...