`

Scoket:TCP通讯模型

 
阅读更多
Scoket:TCP通讯模型
 
Socket编程模型是Java网络编程的基础,在Socket API的基础上,可以做出更多的网络应用程序,比如FTP、HTTP、QQ等通讯工具都可以通过Socket API来实现。
 
一、最简单的Socket编程模型:
 
package lavasoft.ex1; 

import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 

/** 
* 最简单的ScoketServer 

* @author leizhimin 2009-11-20 21:54:37 
*/
 
public class TestServer { 
        public static void main(String[] args) throws IOException { 
                ServerSocket ss = new ServerSocket(9999); 
                while (true) { 
                        System.out.println("------------"); 
                        Socket s = ss.accept(); 
                        System.out.println(s.getLocalPort() + " " + s.getPort() + " " + s.getLocalAddress().getHostAddress()); 
                        System.out.println(s.getInetAddress().getHostAddress() + ":" + s.getPort() + "客户端已经连接上了服务端ServerSocket!"); 
                } 
        } 
}
 
import java.io.IOException; 
import java.net.Socket; 

/** 
* 最简单的Socket 

* @author leizhimin 2009-11-20 22:04:40 
*/
 
public class TestClient { 
        public static void main(String[] args) throws IOException { 
                for (int i = 0; i < 5; i++) { 
                        Socket s = new Socket("192.168.1.101", 9999); 
                        s.close(); 
                } 
        } 
}
 
先启动服务端,然后再启动客户端。
服务端的控制台显示:
------------ 
9999 1863 192.168.1.101 
192.168.1.101:1863客户端已经连接上了服务端ServerSocket! 
------------ 
9999 1864 192.168.1.101 
192.168.1.101:1864客户端已经连接上了服务端ServerSocket! 
------------ 
9999 1865 192.168.1.101 
192.168.1.101:1865客户端已经连接上了服务端ServerSocket! 
------------ 
9999 1866 192.168.1.101 
192.168.1.101:1866客户端已经连接上了服务端ServerSocket! 
------------ 
9999 1867 192.168.1.101 
192.168.1.101:1867客户端已经连接上了服务端ServerSocket! 
------------ 
 
客户端的没有输出。
 
二、服务端向客户端发送数据,客户端接收数据
 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 

/** 
* 向客户端发送数据 

* @author leizhimin 2009-11-21 0:28:42 
*/
 
public class TestServer { 
        public static void main(String[] args) throws IOException { 
                ServerSocket ss = new ServerSocket(9999); 
                while (true) { 
                        System.out.println("--------------server端------------"); 
                        Socket s = ss.accept(); 
                        DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 
                        System.out.println("客户端[" + s.getInetAddress().getHostAddress() + ":" + s.getPort() + "]已经连接!"); 
                        dos.writeUTF("服务端写入客户端的数据:客户端[" + s.getInetAddress().getHostAddress() +":" + s.getPort() + "]已经连接上服务端[" + s.getLocalAddress().getHostAddress() + ":" + s.getLocalPort() + "]!"); 
                        dos.flush(); 
                        dos.close(); 
                        s.close(); 
                } 
        } 
}
 
import java.io.DataInputStream; 
import java.io.IOException; 
import java.net.Socket; 

/** 
* 客户端接收服务端数据 

* @author leizhimin 2009-11-21 0:28:53 
*/
 
public class TestClient { 
        public static void main(String[] args) throws IOException { 
                System.out.println("--------------client端------------"); 
                for (int i = 0; i < 5; i++) { 
                        Socket s = new Socket("192.168.1.101", 9999); 
                        DataInputStream dis = new DataInputStream(s.getInputStream()); 
                        System.out.println("客户端接收的服务端数据:" + dis.readUTF()); 
                        dis.close(); 
                        s.close(); 
                } 
        } 
}
 
服务端控制台:
--------------server端------------ 
客户端[192.168.1.101:1868]已经连接! 
--------------server端------------ 
客户端[192.168.1.101:1869]已经连接! 
--------------server端------------ 
客户端[192.168.1.101:1870]已经连接! 
--------------server端------------ 
客户端[192.168.1.101:1871]已经连接! 
--------------server端------------ 
客户端[192.168.1.101:1872]已经连接! 
--------------server端------------
 
客户端控制台:
--------------client端------------ 
客户端接收的服务端数据:服务端写入客户端的数据:客户端[192.168.1.101:1868]已经连接上服务端[192.168.1.101:9999]! 
客户端接收的服务端数据:服务端写入客户端的数据:客户端[192.168.1.101:1869]已经连接上服务端[192.168.1.101:9999]! 
客户端接收的服务端数据:服务端写入客户端的数据:客户端[192.168.1.101:1870]已经连接上服务端[192.168.1.101:9999]! 
客户端接收的服务端数据:服务端写入客户端的数据:客户端[192.168.1.101:1871]已经连接上服务端[192.168.1.101:9999]! 
客户端接收的服务端数据:服务端写入客户端的数据:客户端[192.168.1.101:1872]已经连接上服务端[192.168.1.101:9999]! 

Process finished with exit code 0
 
三、两端同时读写数据
 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 

/** 
* 服务端先写后读数据 

* @author leizhimin 2009-11-21 23:37:59 
*/
 
public class TestServer { 
        public static void main(String[] args) throws IOException { 
                ServerSocket ss = new ServerSocket(9999); 
                while (true) { 
                        System.out.println("--------------server端------------"); 
                        Socket s = ss.accept(); 
                        DataInputStream dis = new DataInputStream(s.getInputStream()); 
                        DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 
                        System.out.println("客户端[" + s.getInetAddress().getHostAddress() + ":" + s.getPort() + "]已经连接!"); 
                        dos.writeUTF("服务端写入客户端的数据:客户端[" + s.getInetAddress().getHostAddress() +":" + s.getPort() + "]已经连接上服务端[" + s.getLocalAddress().getHostAddress() + ":" + s.getLocalPort() + "]!"); 
                        String _clientdata = null
                        if ((_clientdata = dis.readUTF()) != null
                                System.out.println("读取客户端发送的数据:" + _clientdata); 
                        dis.close(); 
                        dos.flush(); 
                        dos.close(); 
                        s.close(); 
                } 
        } 
}
 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.Socket; 

/** 
* 客户端先读后写数据 

* @author leizhimin 2009-11-21 23:43:05 
*/
 
public class TestClient { 
        public static void main(String[] args) throws IOException { 
                System.out.println("--------------client端------------"); 
                for (int i = 0; i < 5; i++) { 
                        Socket s = new Socket("192.168.1.101", 9999); 
                        DataInputStream dis = new DataInputStream(s.getInputStream()); 
                        DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 
                        String _serverdata = null
                        if ((_serverdata = dis.readUTF()) != null
                                System.out.println("客户端接收的服务端数据:" + _serverdata); 
                        dos.writeUTF("[" + s.getLocalAddress().getHostAddress() + ":" + s.getLocalPort() + "]:Hello Server!"); 
                        dos.flush(); 
                        dos.close(); 
                        dis.close(); 
                        s.close(); 
                } 
        } 
}
 
服务端控制台:
--------------server端------------ 
客户端[192.168.1.101:1873]已经连接! 
读取客户端发送的数据:[192.168.1.101:1873]:Hello Server! 
--------------server端------------ 
客户端[192.168.1.101:1874]已经连接! 
读取客户端发送的数据:[192.168.1.101:1874]:Hello Server! 
--------------server端------------ 
客户端[192.168.1.101:1875]已经连接! 
读取客户端发送的数据:[192.168.1.101:1875]:Hello Server! 
--------------server端------------ 
客户端[192.168.1.101:1876]已经连接! 
读取客户端发送的数据:[192.168.1.101:1876]:Hello Server! 
--------------server端------------ 
客户端[192.168.1.101:1877]已经连接! 
读取客户端发送的数据:[192.168.1.101:1877]:Hello Server! 
--------------server端------------
 
客户端控制台:
--------------client端------------ 
客户端接收的服务端数据:服务端写入客户端的数据:客户端[192.168.1.101:1873]已经连接上服务端[192.168.1.101:9999]! 
客户端接收的服务端数据:服务端写入客户端的数据:客户端[192.168.1.101:1874]已经连接上服务端[192.168.1.101:9999]! 
客户端接收的服务端数据:服务端写入客户端的数据:客户端[192.168.1.101:1875]已经连接上服务端[192.168.1.101:9999]! 
客户端接收的服务端数据:服务端写入客户端的数据:客户端[192.168.1.101:1876]已经连接上服务端[192.168.1.101:9999]! 
客户端接收的服务端数据:服务端写入客户端的数据:客户端[192.168.1.101:1877]已经连接上服务端[192.168.1.101:9999]! 

Process finished with exit code 0
 
 
注意:
对于TCP Socket程序,应该先启动Server,然后再启动Client。
对于发送接收数据,一定要注意读写的顺序,否则会发生相互等待的问题。

本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/237895

分享到:
评论

相关推荐

    tcp多线程socket通讯

    自己闲暇时候写的socket多线程通讯模型,代码虽然比较简单,但是比较容易扩展,麻雀虽小,五脏俱全。

    基于HP_Socket框架的socket通讯源码

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP ...HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中。 此源码为基于HP_Socket框架的socket通讯源码。方便二次开发。省去研究框架的时间

    socket通讯资料汇总

    用JAVA实现基于TCP的SOCKET编程.pdf 用Java实现基于TCPIP协议的网络通信程序.pdf 一种基于JAVA多线程的即时显示策略.pdf 利用Java实现网络通信.pdf 利用Java进行网络编程.pdf 利用JAVA的SOCKET实现网上交谈.pdf...

    把socket IOCP完成端口网络通信模型封装成c++类.zip

    把socket IOCP网络通信模型封装成c++类.zip

    socket通讯汇总

    用Java实现一个Socket通信模型 pdf 用Java实现网络通讯 pdf 用JAVA实现基于TCP的SOCKET编程 pdf 用Java实现基于TCPIP协议的网络通信程序 pdf 一种基于JAVA多线程的即时显示策略 pdf 利用Java实现网络通信 pdf ...

    TCPSocket编程

    独立于具体协议的网络编程接口,在ISO模型中,主要位于会话层和传输层之间 BSD Socket(伯克利套接字)是通过标准的UNIX文件描述符和其它程序通讯的一个方法,目前已经被广泛移植到各个平台。

    易语言-Hp-Socket For E 5.4.2 高性能TCP/UDP通信组件 源码+模块+例程

     为了让使用者能方便快速地学习和使用 HP-Socket ,迅速掌握框架的设计思想和使用方法,特此精心制作了大量 Demo 示例(如:PUSH 模型示例、PULL 模型示例、PACK 模型示例、性能测试示例以及其它编程语言示例)。...

    .Net Socket编程资料

    该压缩包中包含 (1).Net Socket编程基础;(2).NET 中 System.Diagnostics....(8)在C#中使用异步Socket编程实现TCP网络服务的CS的通讯构架;(9)重新研究socket传输自定义对象 9个doc帮助文档,已经两个Demo程序.请下载学习

    TCP/UDP端口调试工具 SocketTool V4.0 绿色版

    单文件版SocketTool是一款小巧实用且功能强大的TCP/UDP网络通讯调试工具,绿色免费且无需安装,通过它可以帮助你检查网络应用软件及硬件的通讯情况。 功能:可以创建创建Socket服务器,创建UDP组播地址及端口,...

    易语言-易语言Socket异步通讯 WSAAsyncSelect模型客户端

    TCP通讯,性能和易语言自带的客户组件差不多能够实时接收,发送数据以及断开事件。好处在于全部API操作,效率会比较的高,而且不需要窗口,有助于更好的控制网络通讯。 特此,共享给大家参考和学习。源码例程全部打包。 ...

    易语言-Hp-Socket For E 5.3.2 高性能TCP/UDP通信组件 源码+模块+例程

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程...

    c_socket编程入门

    抛开ISO/OSI模型的7层构架,单从TCP/IP模型上的逻辑层面上看,.Net类可以视为包含3个层次:请求/响应层、应用协议层、传输层。 WebReqeust和WebResponse 代表了请求/响应层,支持Http、Tcp和Udp的类组成了应用协议...

    C#学习教程之Socket的简单使用

    前言 在开始介绍socket前先补充补充基础知识,在此基础上理解网络通信才会顺理成章,...从协议分层模型方面来讲:TCP/IP由:网络接口层(链路层)、网络层、传输层、应用层。它和OSI的七层结构以及对于协议族不同,下

    SOCKET聊天系统分析设计

    针对当前中小型企业办公人员对即时通讯软件要求较低等问题, 提出了一种基于Java平台下的网络聊天系统的设计与实现...Socket接口是TCP/IP网络的API(应用程序接口),Windows Sockets(Winsock)是一个基于Socket模型的API。

    实验三Socket通信实验报告.doc

    基于C的面向连接的socket编程模型 1. 点对点通信功能 实现网络点对点通讯程序的关键步骤就是实现信息在网络中的发送和接收。数据接收 使用的是Socket,数据发送使用的是NetworkStream。 1.1利用Socket来接收信息 ...

    java网络编程技术课程设计.doc

    利用TCP/IP协议提供的编程接口———Socket(套接字)可以开发出TCP/IP应用程 序。正确的使用WindowsSocket,就可使得不同地址下的进程得以在Windows环境下顺利进 行各种网络通信,因此研究WinSock更有意义。而基于TCP/...

    EDA/PLD中的基于Socket的UDP和TCP编程介绍

     TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议。  TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套...

    Socket通信

    /// 网络通讯事件模型委托 /// public delegate void NetEvent(object sender, NetEventArgs e); /// /// 提供TCP连接服务的服务器类 /// /// 版本: 1.1 /// 替换版本: 1.0 /// /// 特点: /// 1....

    onps是一个开源且完全自主开发的国产网络协议栈,提供完整的ethernet/ppp/tcp/ip协

    从数据链路层到ip层,再到tcp/udp层以及之上的伯克利socket层,最后是用户自己的通讯应用层,onps栈实现了全栈覆盖,能够满足绝大部分的网络编程需求。 本文提供了移植说明: 整个移植说明按照两个主要应用场景展开...

    基于JAVA的网络通讯系统设计与实现的毕业设计

    本设计以JAVA语言为基础,设计并实现一个基于TCP/IP协议的网络通讯系统。系统包括服务端和客户端两个部分,服务端负责接收客户端的连接请求,处理客户端的请求并返回相应的结果,客户端负责向服务端发送请求并接收服务端...

Global site tag (gtag.js) - Google Analytics