博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scoket:TCP通讯模型
阅读量:6086 次
发布时间:2019-06-20

本文共 6633 字,大约阅读时间需要 22 分钟。

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。
对于发送接收数据,一定要注意读写的顺序,否则会发生相互等待的问题。
本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/237895,如需转载请自行联系原作者
你可能感兴趣的文章
javascript call和apply
查看>>
C#中实现验证码的参考代码
查看>>
ASP.NET使用AspNetPager实现简单的分页功能
查看>>
热词搜索_针对关键词的样式实现步骤
查看>>
python常见报错集合
查看>>
iOS--OCR图片识别
查看>>
Handler和AsyncTask
查看>>
关于ios::sync_with_stdio(false);和 cin.tie(0)加速c++输入输出流
查看>>
浅析微信支付:统一下单接口
查看>>
网络对抗技术_实验一_网络侦查与网络扫描
查看>>
黑板模式分析
查看>>
释放Win8.1 WinSxS冗余更新,微软Dism来解决
查看>>
【BZOJ】2243 [SDOI2011]染色
查看>>
springboot集成springsession利用redis来实现session共享
查看>>
文件上传与下载总结
查看>>
【测试基础】测试用例的设计方法
查看>>
MySQL优化-》执行计划和常见索引
查看>>
ThinkPHP中通过URL重写隐藏应用的入口文件index.php的相关服务器的配置
查看>>
18、图片 & 多媒体
查看>>
第七周进度总结
查看>>