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】客户端的运行状态:

注意:由上面的图片可知,我是用真机调试的,所以,真机要和启动服务的设备处在同一局域网才可以跑!

更多相关文章

  1. tcping测试服务器TCP端口
  2. Android(安卓)开发知识点总结
  3. 客户关系管理
  4. Android(安卓)Studio配置javah自动生成头文件
  5. Android(安卓)studio高级使用快捷键
  6. android jni 学习笔记2
  7. 关于自定义控件和属性时TypedArray.getDimension应当注意的问题
  8. android Unterminated string at character 44 of
  9. 三种形式的hello world

随机推荐

  1. android:报Activity has leaked IntentRe
  2. SQLite数据库总结
  3. Android(安卓)监听前台后台切换
  4. 几种常用的适配器--Adapter
  5. Android(安卓)PopupWindow 隐藏软键盘的
  6. androidのMMS短信发送过程(三)
  7. 禁止Edittext弹出系统软键盘 的几种方法
  8. Unity各平台上读写文件-Android例子
  9. 【Android开发小记--6】动画--属性动画以
  10. 【android】对canvas的translate(),save()