android之socket编程实例一
16lz
2021-01-26
Socket本质上就是Java封装了传输层上的TCP协议,所以要想知道它的实现原理,建议去看java的api帮助文档了,这里我就不一一介绍了!下面,我用一个实例给大家说明一下吧。
--------------客户端项目代码------------------------
新建一个Android项目工程SimpleSocket
main_activity.xml文件代码入下:
<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity"><EditTextandroid:id="@+id/ed1"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="给服务器发送信息"/><Buttonandroid:id="@+id/send"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/ed1"android:text="发送"/><TextViewandroid:id="@+id/txt1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/send"android:textSize="15sp"/></RelativeLayout>
MainActivity.java的代码如下:
packagecom.yaowen.simpelsocket;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.support.v7.app.AppCompatActivity;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.TextView;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.net.InetSocketAddress;importjava.net.Socket;importjava.net.SocketTimeoutException;publicclassMainActivityextendsAppCompatActivity{Socketsocket=null;Stringbuffer="";TextViewtextView;Buttonsend;EditTexteditText;StringstrClientText;publicHandlermyHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){if(msg.what==0x11){Bundlebundle=msg.getData();textView.append("server:"+bundle.getString("msg")+"\n");}}};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView=(TextView)findViewById(R.id.txt1);send=(Button)findViewById(R.id.send);editText=(EditText)findViewById(R.id.ed1);send.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){strClientText=editText.getText().toString();textView.append("client:"+strClientText+"\n");//启动线程向服务器发送和接收信息newMyThread(strClientText+"\n").start();}});}classMyThreadextendsThread{publicStringstring;publicMyThread(Stringstring){this.string=string;}@Overridepublicvoidrun(){//定义消息Messagemsg=newMessage();msg.what=0x11;Bundlebundle=newBundle();bundle.clear();try{//连接服务器并设置连接超时为5秒socket=newSocket();socket.connect(newInetSocketAddress("192.168.3.200",30000),5000);//获取输入输出流OutputStreamou=socket.getOutputStream();BufferedReaderbff=newBufferedReader(newInputStreamReader(socket.getInputStream()));//读取发来服务器信息Stringline=null;buffer="";while((line=bff.readLine())!=null){buffer=line+buffer;}//向服务器发送信息ou.write((strClientText+";").getBytes("gbk"));ou.flush();bundle.putString("msg",buffer.toString());msg.setData(bundle);//发送消息修改UI线程中的组件myHandler.sendMessage(msg);//关闭各种输入输出流bff.close();ou.close();socket.close();}catch(SocketTimeoutExceptionaa){//连接超时在UI界面显示消息bundle.putString("msg","服务器连接失败!请检查网络是否打开");msg.setData(bundle);//发送消息修改UI线程中的组件myHandler.sendMessage(msg);}catch(IOExceptione){e.printStackTrace();}}}}
最后别忘了在mainfests文件里添加访问网络权限,否则会抛异常!
<uses-permission android:name="android.permission.INTERNET" />
-------------服务器代码------------------------------
新建一个java项目,如:net
新建一个AndroidService类,代码如下:
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.net.Socket;publicclassAndroidRunableimplementsRunnable{Socketsocket=null;publicAndroidRunable(Socketsocket){this.socket=socket;}@Overridepublicvoidrun(){//向android客户端输出helloworildStringline=null;InputStreaminput;OutputStreamoutput;Stringstr="helloworld!";try{//向客户端发送信息output=socket.getOutputStream();input=socket.getInputStream();BufferedReaderbff=newBufferedReader(newInputStreamReader(input));output.write(str.getBytes("gbk"));output.flush();//关闭socketsocket.shutdownOutput();//获取客户端的信息while((line=bff.readLine())!=null){System.out.print(line);}//关闭输入输出流output.close();bff.close();input.close();socket.close();}catch(IOExceptione){e.printStackTrace();}}}
再新建一个AndroidRunable的类,继承与Runnable类,代码如下:
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.net.Socket;publicclassAndroidRunableimplementsRunnable{Socketsocket=null;publicAndroidRunable(Socketsocket){this.socket=socket;}@Overridepublicvoidrun(){//向android客户端输出helloworildStringline=null;InputStreaminput;OutputStreamoutput;Stringstr="helloworld!";try{//向客户端发送信息output=socket.getOutputStream();input=socket.getInputStream();BufferedReaderbff=newBufferedReader(newInputStreamReader(input));output.write(str.getBytes("gbk"));output.flush();//关闭socketsocket.shutdownOutput();//获取客户端的信息while((line=bff.readLine())!=null){System.out.print(line);}//关闭输入输出流output.close();bff.close();input.close();socket.close();}catch(IOExceptione){e.printStackTrace();}}}
就这样子,服务器代码也编写完了,接下来运行服务代码,再把Android的项目跑起来,下面是这个例子的最终效果图:
1】服务器的运行状态:
2】客户端的运行状态:
注意:由上面的图片可知,我是用真机调试的,所以,真机要和启动服务的设备处在同一局域网才可以跑!
更多相关文章
- tcping测试服务器TCP端口
- Android(安卓)开发知识点总结
- 客户关系管理
- Android(安卓)Studio配置javah自动生成头文件
- Android(安卓)studio高级使用快捷键
- android jni 学习笔记2
- 关于自定义控件和属性时TypedArray.getDimension应当注意的问题
- android Unterminated string at character 44 of
- 三种形式的hello world