Android(安卓)Socket实例(2)
16lz
2021-01-25
http://blog.csdn.net/x605940745/article/details/17001641转载请注明出处
注意点:注册访问的网络权限;android中UI线程不能有访问网络的操作,否则会报android.os.NetworkOnMainThreadException的异常
[html] view plain copy
- <uses-permission
- android:name="android.permission.INTERNET"/>
- Android开发联盟③ 433233634
实例一
客户端
[java] view plain copy
- packagecom.android.xiong.simplesocket;
- importjava.io.BufferedReader;
- importjava.io.IOException;
- importjava.io.InputStreamReader;
- importjava.io.OutputStream;
- importjava.net.InetSocketAddress;
- importjava.net.Socket;
- importjava.net.SocketTimeoutException;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.os.Handler;
- importandroid.os.Message;
- importandroid.view.Menu;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- importandroid.widget.EditText;
- importandroid.widget.TextView;
- publicclassMainActivityextendsActivity{
- Socketsocket=null;
- Stringbuffer="";
- TextViewtxt1;
- Buttonsend;
- EditTexted1;
- Stringgeted1;
- publicHandlermyHandler=newHandler(){
- @Override
- publicvoidhandleMessage(Messagemsg){
- if(msg.what==0x11){
- Bundlebundle=msg.getData();
- txt1.append("server:"+bundle.getString("msg")+"\n");
- }
- }
- };
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- txt1=(TextView)findViewById(R.id.txt1);
- send=(Button)findViewById(R.id.send);
- ed1=(EditText)findViewById(R.id.ed1);
- send.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- geted1=ed1.getText().toString();
- txt1.append("client:"+geted1+"\n");
- //启动线程向服务器发送和接收信息
- newMyThread(geted1).start();
- }
- });
- }
- classMyThreadextendsThread{
- publicStringtxt1;
- publicMyThread(Stringstr){
- txt1=str;
- }
- @Override
- publicvoidrun(){
- //定义消息
- Messagemsg=newMessage();
- msg.what=0x11;
- Bundlebundle=newBundle();
- bundle.clear();
- try{
- //连接服务器并设置连接超时为5秒
- socket=newSocket();
- socket.connect(newInetSocketAddress("1.1.9.30",30000),5000);
- //获取输入输出流
- OutputStreamou=socket.getOutputStream();
- BufferedReaderbff=newBufferedReader(newInputStreamReader(
- socket.getInputStream()));
- //读取发来服务器信息
- Stringline=null;
- buffer="";
- while((line=bff.readLine())!=null){
- buffer=line+buffer;
- }
- //向服务器发送信息
- ou.write("android客户端".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();
- }
- }
- }
- @Override
- publicbooleanonCreateOptionsMenu(Menumenu){
- //Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
- getMenuInflater().inflate(R.menu.main,menu);
- returntrue;
- }
- }
[html] view plain copy
- <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">
- <EditText
- android:id="@+id/ed1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="给服务器发送信息"/>
- <Button
- android:id="@+id/send"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/ed1"
- android:text="发送"/>
- <TextView
- android:id="@+id/txt1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/send"/>
- </RelativeLayout>
服务端
[java] view plain copy
- packagecom.android.net;
- importjava.io.IOException;
- importjava.net.ServerSocket;
- importjava.net.Socket;
- importjava.util.ArrayList;
- importjava.util.List;
- publicclassAndroidService{
- publicstaticvoidmain(String[]args)throwsIOException{
- ServerSocketserivce=newServerSocket(30000);
- while(true){
- //等待客户端连接
- Socketsocket=serivce.accept();
- newThread(newAndroidRunable(socket)).start();
- }
- }
- }
[java] view plain copy
- packagecom.android.net;
- importjava.io.BufferedReader;
- importjava.io.BufferedWriter;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.io.InputStreamReader;
- importjava.io.OutputStream;
- importjava.io.OutputStreamWriter;
- importjava.io.PrintWriter;
- importjava.net.Socket;
- publicclassAndroidRunableimplementsRunnable{
- Socketsocket=null;
- publicAndroidRunable(Socketsocket){
- this.socket=socket;
- }
- @Override
- publicvoidrun(){
- //向android客户端输出helloworild
- Stringline=null;
- InputStreaminput;
- OutputStreamoutput;
- Stringstr="helloworld!";
- try{
- //向客户端发送信息
- output=socket.getOutputStream();
- input=socket.getInputStream();
- BufferedReaderbff=newBufferedReader(
- newInputStreamReader(input));
- output.write(str.getBytes("gbk"));
- output.flush();
- //半关闭socket
- socket.shutdownOutput();
- //获取客户端的信息
- while((line=bff.readLine())!=null){
- System.out.print(line);
- }
- //关闭输入输出流
- output.close();
- bff.close();
- input.close();
- socket.close();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
实例二
客户端
[java] view plain copy- packagecom.android.xiong.sockettwotest;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.os.Handler;
- importandroid.os.Message;
- importandroid.view.Menu;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- importandroid.widget.EditText;
- importandroid.widget.TextView;
- publicclassMainActivityextendsActivity{
- //定义界面上的两个文本框
- EditTextinput;
- TextViewshow;
- //定义界面上的一个按钮
- Buttonsend;
- Handlerhandler;
- //定义与服务器通信的子线程
- ClientThreadclientThread;
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- input=(EditText)findViewById(R.id.input);
- show=(TextView)findViewById(R.id.show);
- send=(Button)findViewById(R.id.send);
- handler=newHandler(){
- @Override
- publicvoidhandleMessage(Messagemsg){
- //如果消息来自子线程
- if(msg.what==0x123){
- //将读取的内容追加显示在文本框中
- show.append("\n"+msg.obj.toString());
- }
- }
- };
- clientThread=newClientThread(handler);
- //客户端启动ClientThread线程创建网络连接、读取来自服务器的数据
- newThread(clientThread).start();
- send.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- try{
- //当用户按下按钮之后,将用户输入的数据封装成Message
- //然后发送给子线程Handler
- Messagemsg=newMessage();
- msg.what=0x345;
- msg.obj=input.getText().toString();
- clientThread.revHandler.sendMessage(msg);
- input.setText("");
- }catch(Exceptione){
- }
- }
- });
- }
- @Override
- publicbooleanonCreateOptionsMenu(Menumenu){
- getMenuInflater().inflate(R.menu.main,menu);
- returntrue;
- }
- }
[java] view plain copy
- packagecom.android.xiong.sockettwotest;
- importjava.io.BufferedReader;
- importjava.io.IOException;
- importjava.io.InputStreamReader;
- importjava.io.OutputStream;
- importjava.net.InetSocketAddress;
- importjava.net.Socket;
- importjava.net.SocketTimeoutException;
- importandroid.os.Handler;
- importandroid.os.Looper;
- importandroid.os.Message;
- publicclassClientThreadimplementsRunnable{
- privateSockets;
- //定义向UI线程发送消息的Handler对象
- Handlerhandler;
- //定义接收UI线程的Handler对象
- HandlerrevHandler;
- //该线程处理Socket所对用的输入输出流
- BufferedReaderbr=null;
- OutputStreamos=null;
- publicClientThread(Handlerhandler){
- this.handler=handler;
- }
- @Override
- publicvoidrun(){
- s=newSocket();
- try{
- s.connect(newInetSocketAddress("1.1.9.30",3000),5000);
- br=newBufferedReader(newInputStreamReader(s.getInputStream()));
- os=s.getOutputStream();
- //启动一条子线程来读取服务器相应的数据
- newThread(){
- @Override
- publicvoidrun(){
- Stringcontent=null;
- //不断的读取Socket输入流的内容
- try{
- while((content=br.readLine())!=null){
- //每当读取到来自服务器的数据之后,发送的消息通知程序
- //界面显示该数据
- Messagemsg=newMessage();
- msg.what=0x123;
- msg.obj=content;
- handler.sendMessage(msg);
- }
- }catch(IOExceptionio){
- io.printStackTrace();
- }
- }
- }.start();
- //为当前线程初始化Looper
- Looper.prepare();
- //创建revHandler对象
- revHandler=newHandler(){
- @Override
- publicvoidhandleMessage(Messagemsg){
- //接收到UI线程的中用户输入的数据
- if(msg.what==0x345){
- //将用户在文本框输入的内容写入网络
- try{
- os.write((msg.obj.toString()+"\r\n")
- .getBytes("gbk"));
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- }
- };
- //启动Looper
- Looper.loop();
- }catch(SocketTimeoutExceptione){
- Messagemsg=newMessage();
- msg.what=0x123;
- msg.obj="网络连接超时!";
- handler.sendMessage(msg);
- }catch(IOExceptionio){
- io.printStackTrace();
- }
- }
- }
[html] view plain copy
- <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">
- <EditText
- android:id="@+id/input"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="@string/input"/>
- <Button
- android:id="@+id/send"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/send"
- android:layout_below="@id/input"/>
- <TextView
- android:id="@+id/show"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/send"/>
- </RelativeLayout>
服务端
[java] view plain copy
- packagecom.android.net;
- importjava.io.IOException;
- importjava.net.ServerSocket;
- importjava.net.Socket;
- importjava.util.ArrayList;
- importjava.util.List;
- publicclassMyService{
- //定义保存所有的Socket
- publicstaticList<Socket>socketList=newArrayList<Socket>();
- publicstaticvoidmain(String[]args)throwsIOException{
- ServerSocketserver=newServerSocket(3000);
- while(true){
- Sockets=server.accept();
- socketList.add(s);
- //每当客户端连接之后启动一条ServerThread线程为该客户端服务
- newThread(newServiceThreada(s)).start();
- }
- }
- }
- packagecom.android.net;
- importjava.io.BufferedReader;
- importjava.io.IOException;
- importjava.io.InputStreamReader;
- importjava.io.OutputStream;
- importjava.net.Socket;
- publicclassServiceThreadaimplementsRunnable{
- //定义当前线程处理的Socket
- Sockets=null;
- //该线程所处理的Socket所对应的输入流
- BufferedReaderbr=null;
- publicServiceThreada(Sockets){
- this.s=s;
- try{
- br=newBufferedReader(newInputStreamReader(s.getInputStream()));
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- @Override
- publicvoidrun(){
- Stringcontent=null;
- //采用循环不断的从Socket中读取客户端发送过来的数据
- while((content=readFromClient())!=null){
- //遍历socketList中的每个Socket
- //将读取到的内容每个向Socket发送一次
- for(Sockets:MyService.socketList){
- OutputStreamos;
- try{
- os=s.getOutputStream();
- os.write((content+"\n").getBytes("gbk"));
- }catch(IOExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- }
- }
- }
- //定义读取客户端的信息
- publicStringreadFromClient(){
- try{
- returnbr.readLine();
- }catch(Exceptione){
- e.printStackTrace();
- }
- returnnull;
- }
- }
更多相关文章
- 万字长文带你了解最常用的开源 Squid 代理服务器
- Nginx系列教程(一)| 手把手教你在Linux环境下搭建Nginx服务
- Nginx系列教程(二)| 一文带你读懂Nginx的正向与反向代理
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- android报The content of the adapter has changed but ListView
- Android(安卓)HandlerThread详解
- Android(安卓)Toast 总结
- Android(安卓)反序列化异常EOFException的解决