`

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

分享到:
评论

相关推荐

    SuperSocket-master_Socket基于TCP、UDP

    - SuperSocket为TCP应用提供了一套完整的事件驱动模型,如连接建立、数据接收、断开连接等,开发者只需关注这些事件的处理即可。 - 它提供了简单易用的API,如`Server.Start()`启动服务器,`Session.Send()`发送...

    异步Socket的Tcp通讯服务器

    本篇文章将深入探讨异步Socket在TCP通讯服务器中的应用,以及如何使用这种技术来管理客户端连接并进行有效通信。 首先,我们需要了解什么是Socket。Socket是网络通信中的一个抽象概念,它代表了两个端点之间的连接...

    异步Socket方式实现TCP通讯

    异步Socket编程是实现TCP通讯的一种高效方法,尤其适用于处理大量并发连接和I/O操作的情况。本篇文章将深入探讨异步Socket方式实现TCP通讯的基本原理、步骤以及相关知识点。 一、异步Socket概述 异步Socket编程的...

    异步Socket实现TCP网络服务的CS的通讯构架

    本主题将深入探讨如何使用C#的异步Socket实现TCP网络服务的CS通讯构架。首先,我们需要理解什么是Socket和TCP协议。 Socket,通常被称为套接字,是网络编程中的基本接口,允许应用程序通过网络进行通信。它提供了...

    TCP与串口间的通信方式。Socket通信

    2. 异步Socket通信:异步Socket采用事件驱动模型,允许客户端和服务端同时处理多个请求,提高系统并发性。在.NET中,可以通过I/O completion ports (IOCP) 或异步方法(如BeginSend、BeginReceive)来实现。 对于...

    SuperSocket Socket C# 通讯详细介绍

    **SuperSocket Socket C# 通讯详解** 在C#编程领域,网络通信是一个不可或缺的部分,而SuperSocket则是一个强大且易用的.NET Socket服务器框架。它为开发者提供了构建自定义网络应用服务的基础,使得处理TCP连接变...

    Socket TCP 调试助手 Modbus调试

    在TCP/IP模型中,Socket工作在传输层,提供了进程间的网络通信。Socket分为两种类型:流式Socket(SOCK_STREAM,基于TCP)和数据报Socket(SOCK_DGRAM,基于UDP)。在这个场景下,我们主要关注流式Socket,因为TCP是...

    在C#中使用异步Socket编程实现TCP网络服务的CS的通讯构架

    总结来说,使用C#的异步Socket编程实现TCP网络服务的C/S通讯构架,需要设计和实现一系列辅助类,通过事件驱动模型增强网络通信的灵活性和可靠性。通过这样的方式,可以构建出稳定且可扩展的网络应用程序。同时,良好...

    C#的TCP异步SOCKET通讯类

    以下是对"TCP异步SOCKET通讯类"的详细解释: 1. **TCP基础**:TCP是一种面向连接的、可靠的传输协议,它保证了数据包在传输过程中的顺序和完整性。通过三次握手建立连接,四次挥手断开连接。 2. **Socket类**:在...

    Socket通讯调式工具(TCP&UDP;)

    在TCP/IP模型中,Socket接口提供了应用程序与传输层的交互方法。TCP(Transmission Control Protocol)是面向连接的协议,保证数据的可靠传输,而UDP(User Datagram Protocol)则是无连接的,提供快速但不保证的...

    socket多人即时通讯系统

    Socket分为流式(Stream Socket,TCP)和数据报(Datagram Socket,UDP)两种类型,本系统可能采用了流式Socket,因为TCP协议能确保数据的有序、无丢失传输,适合即时通讯需求。 2. **TCP连接**:TCP(Transmission...

    Ubuntu 上采用 Boost asio 异步 TCP 通讯boostasiotcp-master.zip

    void handle_connection(boost::asio::ip::tcp::socket socket) { // 处理连接逻辑 } int main() { try { boost::asio::io_service io_service; boost::asio::ip::tcp::acceptor acceptor(io_service, boost:...

    TcpSocket通讯和Socket客户端

    总结来说,`TcpSocket`和`Socket`在C#中提供了强大的TCP通信能力,结合异步编程模型,可以构建高效、可扩展的网络服务。通过以太网,这些网络通信可以跨越局域网甚至广域网,实现远程数据交换。在实际项目中,理解和...

    Tcp实现的简单通讯

    TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于...总的来说,TCP实现的简单通讯涉及了网络通信的基本原理和Qt框架的网络编程接口,通过实践可以深入理解TCP协议的工作机制和Qt的网络编程模型。

    matlab-QT测试tcp通讯SOCKET实例程序-源码

    这个"matlab_QT测试tcp通讯SOCKET实例程序_源码"的压缩包很可能是包含MATLAB和QT两个环境下的源代码,演示了如何在各自的环境中设置TCP客户端和服务器,进行数据交换。通过分析和运行这些源码,你可以深入理解TCP...

    C#异步TCP Socket通讯代码

    标题中的“C#异步TCP Socket通讯代码”是指利用C#的异步编程模型来实现TCP通信。异步编程在处理网络通信时尤为重要,因为它允许应用程序在等待I/O操作完成时继续执行其他任务,避免了线程阻塞,提高了程序的响应性和...

    c# Tcp通讯服务控件

    本篇将详细介绍“C# Tcp通讯服务控件”,它是一个用于简化TCP通信的自封装控件,方便开发者在项目中快速集成和定制。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它通过三次...

    【Socket编程】--TCP异步通讯一服务器多客户端

    本篇将深入探讨"【Socket编程】--TCP异步通讯一服务器多客户端"这一主题。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它确保了数据的顺序传输和错误检查。在TCP异步通讯中,服务器并...

    VC TCP/UDPsocket通讯协议

    **TCP/UDP Socket通讯协议详解** 在计算机网络编程中,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种最常用的传输层协议,它们在客户端/服务器(C/S)模式下发挥着至关重要的作用。...

Global site tag (gtag.js) - Google Analytics