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套接字通信:服务器接收消息