如何使用java语言中socket关键字通信

[color=blue][/color] 学习java网络通信已经有一段时间了,做了一些项目,诸如仿腾讯qq的pc机与pc之间的聊天程序、远程控制、网络画板等等一些小项目。对java中的Socket通信技术已经有了一定的理解。 ---[url=http://www.qinaid520.com]亲爱的[/url]
众所周知,在Internet 被广泛使用的今天, 网络编程就显得更加重要了, 网络应用是Java 语言取得成功的领域之一,Java 已经成为Internet 上最为流行的一种编程语言。Java 语言的网络功能非常强大, 其网络类库不仅使我们可以开发访问Internet 应用层程序,而且还可以实现网络底层的通信。在TCP/IP 网络中,不同的机器之间通信时,数据的传输是由传输层控制的, 这包括数据要发往的目标机器及应用程序 数据的质量控制等。TCP/ IP 网络中最常用的传输协议TCP 和UDP , 用户数据报就属于这一层。传输层通常以TCP 和UDP 协议来控制端点到端点的通信。用于通信的端点是由Socket来定义的, 而Socket 是由IP 地址和端口号组成。常用的Socket 类型有两种: 流式Socket 和数据报式Socket 。流式是一种面向连接的Socket , 针对于面向连接的TCP 服务应用; 数据报式Socket 是一种无连的Socket ,对应于无连接的UDP 服务应用。本文介绍一种将Java 中的Socket 的类ServerSocket类分别用于客户端和服务器端, 在任意两台机器间建立流式连接, 实现点到点的通信的Java 程序实现方法。
一: Socket 通信基于Java 的实现Scoket 是网络上运行的两个程序间双向通信的一端,它既可以接受请求, 也可以发送请求, 利用它可以较为方便地进行网络上的数据传递。在
Java 中,可以将Sockek 类和ServerSocket 类分别用于客户端和服务器,在任意两台机器间建立连接。Socket 类用在客户端, 用于通过构造一个Socket 类来建立与服务器的连接。ServerSocket 类用于服务器端,用于接收客户端传送的数据。Java语言实现Socket 通信, 一般需要按以下三个步骤进行。
(1)建立服务器类在两台机器之间建立连接, 其中必须要把一台机器作为服务器, 在服务器端用Java 中的服务器类ServerSocket ,并使用端口号作为参数来创建服务器对象。例如: ServerSocket server = new Server2Socket ( 3000) ;server 是服务器对象, 它使用3000 号端口, 当一个客户端程序建立一个Socket 连接且所连接端口号为3000 时, 服务器对象server 便响应这个连接。接下来用Server . accept ( ) 方法创建一个Socket对象,服务器端可以利用这个Socket 对象与客户端进行通信。接着定义输入流in 及输出流out 对象,并进行封装,随后,就可以使用输入流in . read2Line ( ) 方法得到客户端的输入,也可以使用输出流out . println ( ) 方法向客户端发送数据了。最后,在所有通信结束以后, 应关闭这两个数据流,关闭的顺序是先关闭输出流, 再关闭输入流。
(2)建立客户端代码与服务器端相比, 客户端要简单一些。客户端需用到服务器所在机器的IP 地址以及服务器的端口作为参数来创建一个Socket 对象, 得到这个对象后,就可以用该对象相应的方法实现数据的输入和输出了。例如:Socket socket= new Socket ( ”192 . 168 . 0 . 5”,3000) ;该程序代码建立了一个socket 对象,这个对象连接到IP 地址为192 . 168 . 0 . 5 的主机, 端口号为3000 的服务器对象。
同服务器端一样, 接着要建立输入流和输出流,分别对应服务器的输出和客户端的写入。
(3)建立用户界面用户界面可以根据自已的喜好及通信要求建立。下面就以两台机器为例,具体说明实现
Socket 通信的关键程序代码:
步骤a: 服务器端由SimpleServer 和SimpleServer2Worker 类组成, SimpleServer 是实现该通信主类,在该类中要完成Socket 对象的定义, 并建立一个循环来检测是否有客户机连接到服务器上, 如果有, 则创建一个线程为这个客户机服务。SimpleServerWorker 则是一个处理线程的类, 它实现线程的Runnable 接口, 主要由该线程完成信息及
数据处理的显示等功能。具体代码如下:
import java . io . 3 ;
import java . net . 3 ; / / 引入数据包/ /
public class SimpleServer/ / 定义类/ /
{private static / / 定义通信端口号为3000/ /
final int PORT-NUMBER = 3000 ;
public static void main ( String[ ] args)
{ ServerSocket server = null ; / / 定义对象,并初始化/ /
Socket theSocket = null ;
DataInputStream theReader = null ;
PrintStream theWriter = null ;
try { server = new ServerSocket ( PORT-NUMBER) ;
/ / 实例化对象/ /
SimpleServerWorker worker ; / / 定义类对象/ /
Thread thread ; / / 定义一个线程对象/ /
while ( true) / / 循环检测是否有客户机连接到服务器上/ /
{ theSocket = server . accept ( ) ;/ / 调server 对象的accept ( ) 方法对通信端口监测
worker = new SimpleServerWorker ( theSocket ) ;/ / 实例化worker 对象/ /
thread = new Thread (worker ) ; / / 线程实例化/ /
thread . start ( ) ; / / 启动线程/ /
} }catch ( Exception e ) { . . . } / / 异常处理/ /
} / / SimpleServer 类完成/ /
SimpleServerWorker 类的程序代码与Java 处理一般线程程序的编写方法相同,在这就不在敷述。
步骤b: 客户端由SimpleClient 类组成
public class SimpleClient / / 定义类/ /
{ . . .
public static void main ( String[ ] args)
{ . . . / / 在此定义对象并初始化/ /
try
{ / / 把服务器的IP 地址和通信端口号
theSocket = new Socket ( theAddress , PORT-NUMBER) ;作参数实例化Socket 对象/ /
theReader = new BufferedReader ( new InputStreamReader (theSocket . getInputStream( ) ) ) ; / / 定义并实例化一个输入流对象/ /
theWriter = new PrintWriter ( newOutputStreamWriter ( theSocket . getOutputStream( ) ) ) ; / / 定义并实例化一个输出流对象/ /
while ( true) / / 循环将数据发送给服器端/ /
{ . . theWriter . println (mesg) ;
theWriter . flush ( ); / / 清空输出流, 并将缓冲区中的数据强制送出/ / . . .
}
二:小结
Java 语言中的Socket 类的功能非常强大。虽然传统编程语言如VB 、C + + 等也可以实现Socket通信,但其实现方法的难度很大。一般编程人员都望而生畏。编程难度主要体现在通信机器之间如何实现的同步及多任务处理方面。Java 拥有自已的语言优势( 1) Java 语言对线程的内置和本地的支持,它支持多线程。这样在一台服器与多客户机进行通信就可以建立并启动多个线程来为客户机服务。而编程人员不需要考虑CPU 对线程之间的调度( 2) Java 提供管理数据流的类,用户在传送和接收数据时,只需定义一个相应对象,用对象相应方法接受和发送数据就可。很好的解决了传统编程中技术难点。虽然现在微软也推出了VB.
NET、VC + + . NET 等语言用以加强网络编程功能。用这些新软件实现Socket 通信编程方法与Ja2va 语言实现的方法大体相同。即使在这样状态下,Java 同样拥有自己最大的语言优势即平台工作。这样建立通信时不须考虑所要通信机器之间所安装的操作系统是否一致。
综上所述,不仅介绍了Java 中实现端口侦听、网络连接、数据发送、数据的接受的具体方法, 还运用了Java 实现网络功能时所必然要涉及到的如多线程技术和利用控制码控制程序运行状态等的实现方法。了解并掌握这些对我们编写功能更强、结构更复杂的网络应用程序非常有帮助。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; namespace 监听 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //第一步 ,创建一个Socket Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //第二步,绑定 //二.1,获取本机的IP地址 IPAddress[] address = Dns.GetHostAddresses(Dns.GetHostName()); //二.2,绑定 serverSocket.Bind(new IPEndPoint(address[0], 60000)); //第三步,监听 serverSocket.Listen(10); //第四步,接受 Socket clientSocket = serverSocket.Accept(); //第五步,接受数据 Byte[] buffer = new Byte[256]; clientSocket.Receive(buffer); if (buffer.Length != 0) this.listBox1.Items.Add(Encoding.UTF8.GetString(buffer)); //第六步,关闭 clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); } private void button5_Click(object sender, EventArgs e) { Socket clientSocket = new Socket(AdddressFamily.InterNetWork,SocketType.Stream,ProtocolType,Tep); IPAddress[]address = Dns.GetHostAddresses(Dns.GetHostAddresses); clientSocket.Connect(AddressFamily[1],53333); string strMsg = this.richTextBox1.Text; Byte[]buffer = Encoding.UTF8.GetBytes(strMsg); if (clientSocket !=null) { clientSocket.Send(buffer); } else MessageBox.Show("something you forgetted"); clientSocket.Shutdown(SocketShutdown.Both); } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值