范例和案例

核心提示Socket是对 TCP/IP 协议的封装和应用,根据底层封装协议的不同,Socket 的类型可以分为流套接字和数据报套接字两种。流套接字将TCP作为端对端协议,提供了一个可信赖的字节流服务;数据报套接字使用 UDP 协议,提供数据打包发送

Socket是TCP/IP协议的封装和应用。根据底层封装协议的不同,套接字类型可以分为流套接字和数据报套接字。Socket使用TCP作为端到端协议,提供可靠的字节流服务。数据套接字使用UDP协议,该协议提供数据打包和发送服务,应用程序可以通过该协议发送高达64KB的信息。Socket的通信模型图如图1-1所示。

图1-1套接字通信模型图

从图1-1可以很容易的看出,当使用Socket在两个应用程序之间进行通信时,可以选择使用TCP或者UDP作为其底层协议。比较这两种方法,我们会发现它们各有利弊。TCP先连接接收方,再发送数据,这样保证了成功率,也比较慢。将UDP数据打包成包,然后直接发送到对应的IP地址,速度快,但是成功率不能保证,数据大小有限。

一个功能完备的套接字必须包含以下基本结构,其工作过程包括四个基本步骤:创建套接字,打开与套接字连接的输入/输出流,按照一定的协议读/写套接字,关闭套接字。

Java java.net包中提供了Socket和ServerSocket两个类,分别用于表示双向连接的客户端和服务器端。它们是套接字编程的核心类。构造的方法有很多种,一般使用以下两种方法:

Socket client =新套接字;

server socket server = new server socket;

其中Socket类用来实例化一个客户端,参数是要访问的IP地址和端口号,要和服务器保持一致。Server类用来实例化一个服务器,它的参数用来设置端口。这里的端口不能与“3306”、“80”、“8080”等常用端口号冲突。

以基于TCP的Socket为例,说明如何使用Socket。

用Java Socket创建一个服务器端程序,运行在eclipse平台和PC上,然后在手机上编写客户端程序,在局域网上访问服务器端。先写服务器,代码如下:

包装插座;

导入Java . io . buffered reader;

导入Java . io . io exception;

导入Java . io . inputstream;

导入Java . io . inputstreamreader;

导入Java . io . output stream;

导入Java . net . server socket;

导入Java . net . socket;

公共类sockettest {

公共静态void main抛出IOException {

@ SuppressWarnings

server socket service = new server socket;

当{

//等待客户端连接

Socket socket = service.accept

新线程)。开始;

}

}

}

类AndroidRunable实现Runnable{

Socket socket = null

公共机器人可运行

{

this.socket = socket

}

公共无效运行{

//输出你好这是www.bigbirdic.com到安卓客户端!

String line = null

InputStream输入流;

OutputStream输出流;

String str= "您好这里是www.bigbirdic.com!";

尝试{

//向客户端发送信息

output stream = socket . get output stream;

inputStream = socket . getinputstream;

buffered reader bfr = newbuffered reader);

output stream . write);

outputStream.flush

//半封闭套接字

socket . shut down output;

//获取客户端的信息

while)!=null){

system . out . print;

}

//关闭iostream

outputStream.close

bfr.close

inputStream.close

套接字. close;

}接住

{

e.printStackTrace

}

}

}

这里的代码非常简单。只需使用ServerSocket建立服务,将端口号设置为2226,然后返回一个“Hello this is www.bigbirdic.com!”每当客户端访问它时。。编辑完服务器后,我们在Android Studio中创建一个类来创建Socket客户端,代码如下:

包com . RF star . socket test;

导入Android . util . log;导入Java . io . buffered reader;导入Java . io . io exception;导入Java . io . inputstreamreader;导入Java . io . output stream;导入Java . net . inetsocketaddress;导入Java . net . socket;导入Java . net . socket exception;公共类SocketUtil {私有字符串str私用插座插座;私有字符串IP;public SocketUtil { this.str = strthis.ip = ip}公共字符串sendMessage { String result =尝试{ socket = new Socket

//ip是计算机的本地网络地址。

socket.connect,5000);

output stream output stream = socket . get output stream;output stream . write);outputStream.flushbuffered reader bfr = new buffered reader));String line = nullstring buffer buffer = new string buffer;while)!= null){ buffer . append;} result = buffer.toStringbfr.closeoutputStream.close套接字. close;}catch {//连接超时,UI界面显示消息log . I);} catch { e.printStackTrace}返回结果;}}在这个类中,使用Socket连接到服务器,然后发送相关信息并从服务器接收数据。代码并不难,所以下面介绍如何在MainActivity中使用这个类。当然,在使用它之前,你必须修改MainActivity的布局文件activity_main.xml,代码如下:

< xml版本="1.0 "编码="utf-8 " >

这里,一个EditText用于编辑发送到服务器的内容,一个按钮用于点击触发网络通信的事件,然后一个TextView用于显示服务器返回的值。接下来在MainActivity中,通过findViewById方法获取这些控件,并设置Button的click事件。代码如下:

包com . RF star . socket test;

导入androidx . app compat . app . app compat activity;导入Android . OS . bundle;导入Android . OS . handler;导入Android . OS . message;导入Android . view . view;导入Android . widget . button;导入Android . widget . edittext;导入Android . widget . textview;导入org . W3C . DOM . entity reference;公共类MainActivity扩展了appcompatativity { private Button Button;私有TextView textView私有字符串结果;private Handler Handler = new Handler { @ Override public void handle message { super . handle message;if { textView.setText} } };@ Override protected void onCreate { super . onCreate;setContentViewinitView} private void init view { text view = findViewById;final EditText EditText = findViewById;button = findViewByIdbutton . setonclicklistener { @ Override public void onClick { new Thread { @ Override public void run { result = new socket util . tostring," 192.168.110.82 ")。发送消息;handler.sendEmptyMessage} }).开始;} });}}

至此,示例代码完成,别忘了在AndroidManifest.xml中申请权限:

在Activity中,只处理click事件,服务器返回的值显示在TextView上。添加网络权限后,运行程序,在EditText中输入内容,然后点击“发送消息”按钮向服务器发送“hello”,收到“Hello this is www.bigbirdic.com!”从服务器上。,如图1-2所示。

观察服务器代码所在的控制台,发现手机发送的内容确实收到了,如图1-3所示。

图1-2套接字通信:客户端发送和接收响应消息。

图1-3套接字通信:服务器接收消息

 
友情链接
鄂ICP备19019357号-22