Socket编程半双工

服务器

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通道  另一个从控制台读取数据流

时间: 2024-10-14 05:10:17

Socket编程半双工的相关文章

socket编程原理

socket编程原理 1.问题的引入 1) 普通的I/O操作过程: UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-read-close).在一个用户进程进行I/O操作时,它首先调用"打开"获得对指定文件或设备的使用权,并返回称为文件描写叙述符的整型数,以描写叙述用户在打开的文件或设备上进行I/O操作的进程.然后这个用户进程多次调用"读/写"以数据传输.当全部的传输操作完毕后,用户进程关闭

iOS开发——网络编程OC篇&Socket编程

Socket编程 一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要

Linux Socket编程-(转自吴秦(Tyler))

"一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下: 1.网络中进程之间如何通信?

Python Socket 编程——聊天室演示样例程序

上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket 编程的理解. 聊天室程序需求 我们要实现的是简单的聊天室的样例,就是同意多个人同一时候一起聊天.每一个人发送的消息全部人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.例如以下图: 图来自:http://www.ibm.com/developerworks/linux/tu

linux下socket编程-进程间通信

一.什么是Socket Socket接口是TCP/IP网络通信的API,Socket接口定义了许多函数或例程,可以用它们来开发TCP/IP网络上的应用程序. Socket类型有两种:流式Socket (SOCK_STREAM)和数据报式Socket(SOCK_DGRAM).流式是一种面向连接针对于面向连接的TCP服务应用:数据报式Socket是一种无连接针对无连接的UDP服务应用.sock通信的基本过程如下: 二.Socket建立 程序可以调用Socket函数建立socket,该函数返回一个类似

读懂Java中的Socket编程(转)

Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的Socket编程,并且如何写一个客户端/服务器程序. 餐前甜点 Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对这个

(转)Java Socket编程

原文出自:http://www.cnblogs.com/rocomp/p/4790340.html Socket是网络驱动层提供给应用程序编程接口和一种机制.可以把Socket比喻成一个港口码头,应用程序只要把货物放到港口码头上,就算完成了货物的运送.对于接收方应用程序也要创建一个港口码头,只需等待货物到达码头后将货物取走. InetAddress          InetAddress类用于标识网络上的硬件资源,标识互联网协议(IP)地址.           该类没有构造方法       

Java Socket 编程

1. 背景 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节. java.net 包中提供了两种常见的网络协议的支持: TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信.通常用于互联网协议,被称 TCP / IP. UDP:UDP 是用户数据报协议的缩写,一个无连接的协议.提供了应用程序之间要

Python Socket编程

因需要做一个监测TCP数据内容的小插件,学习了局域网内部的封装好的传输软件Socket: 一.Socket的简介如下: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员 做网络开发所用的接口,这就是Socket编程接口:HTTP是轿车,提供了封装或者显示数据的具体形式:Socket是发动机, 提供了网络通信的能力.