Socket实现两台手机通信,定向转发数据
来源:互联网 发布:刻录光盘软件 编辑:程序博客网 时间:2024/06/06 08:50
最近要面试了,想练习一下网络编程吧,想想来搞搞实现太手机聊天功能吧,其实聊天功能有集成好的框架,有apache的mina框架,想要知道这个框架怎么用,看我的下一篇博客吧,现在我们开讲讲怎么用socket通信吧
首先,什么叫socket?字面意思叫 插座; 灯座; 窝,穴; [解] 眼窝,孔窝
网络用语叫套接字原理是基于tcp/ip 协议的一种通信手段,
下面来看我的客户端程序吧,首先新建一个java工程。里面就有一个类用于客户端提供服务;
package javagreendao;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.LinkedHashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class SocketTest { private static List<Socket>listsocket=new LinkedList<Socket>(); private static Map<String,Socket>mapsocket=new LinkedHashMap<>(); public static void main(String[] args) { System.out.println("连接成功"); int port=1001; try { @SuppressWarnings("resource") ServerSocket serverSocket=new ServerSocket(port); while (true) { // System.out.println("阻塞开始"); final Socket socket=serverSocket.accept(); listsocket.add(socket); ExecutorService executorService=Executors.newFixedThreadPool(listsocket.size()); executorService.execute(new Runnable() { @Override public void run() { try { //输入流获取客户端数据 InputStream inputStream=socket.getInputStream(); //输出流给客户端发数据 OutputStream outputStream=socket.getOutputStream(); byte[] buffer=new byte[1024]; int len; while((len=inputStream.read(buffer))!=-1){ String text=new String(buffer, 0, len); System.out.println("内容"+text); if (text.startsWith("#")) { mapsocket.put(text, socket); outputStream.write("收到".getBytes()); }else { String[] split=text.split(":"); String key="#"+split[0]; String countext=split[1]; //给特定用户发送消息 Socket tomapssoSocket=mapsocket.get(key); if (null!=tomapssoSocket){ OutputStream toStream=tomapssoSocket.getOutputStream(); toStream.write(countext.getBytes("UTF-8")); } }// //群发// for (Socket pluSocket :listsocket) {// if (pluSocket!=socket) {// OutputStream giveclic=pluSocket.getOutputStream();// giveclic.write(text.getBytes());// }else {// outputStream.write("收到".getBytes());// }// } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
服务端代码其实很简单,只要提供认证和类容就可以转发给指定的手机客户端了,下面我们来看看客户端代码吧,客户端其进入程序,就应该发一个认证连接服务端,然后在在客户端开启一个连接池。当有消息发送到大的是时候必须转发。这种东西就要写在service里面,然后定义动态广播,具体代码如下
activity类显示
package com.example.xutilsdemo;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import javax.security.auth.PrivateCredentialPermission;import com.lidroid.xutils.ViewUtils;import com.lidroid.xutils.view.annotation.ViewInject;import com.lidroid.xutils.view.annotation.event.OnClick;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class SocketActivity extends Activity{ @ViewInject(R.id.but_login) private Button but_login;// @ViewInject(R.id.but_outh)// private Button but_outh;// @ViewInject(R.id.but_service)// private Button but_service;// @ViewInject(R.id.but_lose)// private Button but_lose; @ViewInject(R.id.edit_context) private EditText edit_context;// @ViewInject(R.id.edit_outh)// private EditText edit_outh; private String ip="10.188.20.129"; private int port=1001; private Socket socket; /** * 监听广播 */ private SocketPushBroadcastReservcer spbr=new SocketPushBroadcastReservcer() { @Override public void onReceive(Context context, Intent intent) { if (SocketPushBroadcastReservcer.ACTION_STRING.equals(intent.getAction())) { String contextString=intent.getStringExtra(SocketPushBroadcastReservcer.DATA_KEY); Log.i("获取消息", contextString); if (!contextString.equals(null)) { Log.i("获取消息", contextString); Toast.makeText(getApplicationContext(), contextString, Toast.LENGTH_LONG).show(); } } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ViewUtils.inject(this); startService(new Intent(this,SocketCorserviceService.class)); IntentFilter intentFilter=new IntentFilter(); //注册广播 intentFilter.addAction(SocketPushBroadcastReservcer.ACTION_STRING); registerReceiver(spbr, intentFilter); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); unregisterReceiver(spbr);//注销广播 } @OnClick(R.id.but_login) public void but_login(View v){ if (TextUtils.isEmpty(edit_context.getText())) { return ; } try { // OutputStream outputStream = socket.getOutputStream();// outputStream.write(edit_context.getText().toString().getBytes()); ExecutorService executorService=Executors.newFixedThreadPool(2); executorService.execute(new Runnable() { @Override public void run() { SocketConnectorMessager.getConnectorMessager(). putRequest(edit_context.getText().toString().trim()); } }); } catch (Exception e1) { e1.printStackTrace(); } }
提供服务类
SocketConnector
package com.example.xutilsdemo;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * socket 类容提供者 * @author double * */public class SocketConnector { private String ip="10.188.20.129"; private int port=1001; private Socket socket; SocketConnectorLinstre soLinstre; private ArrayBlockingQueue<String> queue=new ArrayBlockingQueue<>(8); public SocketConnector(){ } private class RwquestWork implements Runnable{ @Override public void run() { try { OutputStream outputStream=socket.getOutputStream(); while (true) { String context=queue.take(); outputStream.write(context.getBytes("UTF-8")); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }// /**// * 发送// */// public void send(String context){// OutputStream outputStream;// try {// outputStream = socket.getOutputStream();// outputStream.write(context.getBytes("UTF-8"));// } catch (Exception e) {// e.printStackTrace();// }// } public void putRequest(String context){ System.out.println(">>>>>>>>>"+context); try { queue.put(context); System.out.println("queue.take()"+queue.take()); } catch (Exception e) { e.printStackTrace(); } } /** * 连接 */ public void connector(){ try { if (null==socket||socket.isClosed()){ socket=new Socket(ip, port); } new Thread(new RwquestWork()).start(); ExecutorService executorService=Executors.newFixedThreadPool(3); executorService.execute(new Runnable() { @Override public void run() { try { InputStream inputStream=socket.getInputStream(); byte[] buffer=new byte[1024]; int len; while ((len=inputStream.read(buffer))!=-1) { //服务端返回的结果 final String request=new String(buffer,0,len); if (null!=soLinstre) { soLinstre.notfiyData(request); } }// // OutputStream outputStream=socket.getOutputStream();// while (true) {// String context=queue.take();// System.out.println("---------"+context);// outputStream.write(context.getBytes("UTF-8")); // } } catch (Exception e) { e.printStackTrace(); } } }); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 断开 */ public void disConnector(){ try { if (null==socket||socket.isClosed()){ socket.close(); socket=null; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 认证 */ public void Auth(String auth){ OutputStream outputStream; try { outputStream = socket.getOutputStream(); outputStream.write(auth.getBytes("UTF-8")); } catch (Exception e) { e.printStackTrace(); } } public void setSocketConnectorLinstre(SocketConnectorLinstre soLinstre ){ this.soLinstre=soLinstre; } public interface SocketConnectorLinstre{ public void notfiyData(String data); }}
SocketConnectorMessager类主要用于认证
package com.example.xutilsdemo;import com.example.xutilsdemo.SocketConnector.SocketConnectorLinstre;/** * 消息提供者 * @author double * */public class SocketConnectorMessager implements SocketConnectorLinstre{ private static SocketConnectorMessager messager; private SocketConnector socketConnector; private SocketConnectorLinstre soLinstre; private SocketConnectorMessager(){ } public static SocketConnectorMessager getConnectorMessager(){ messager=new SocketConnectorMessager(); return messager; } public void connect(String auth){ socketConnector=new SocketConnector(); socketConnector.setSocketConnectorLinstre(this); socketConnector.connector();//连接, socketConnector.Auth(auth);//认证 } public void putRequest(String request){ if (socketConnector==null) { socketConnector=new SocketConnector(); } socketConnector.connector(); System.out.println("++++++++"+request); socketConnector.putRequest(request); } @Override public void notfiyData(String data) { if (soLinstre!=null) { soLinstre.notfiyData(data); } } public void setSocketConnectorLinstre(SocketConnectorLinstre soLinstre ){ this.soLinstre=soLinstre; } public interface SocketConnectorLinstre{ public void notfiyData(String data); }}
SocketCorserviceService后台服务类
package com.example.xutilsdemo;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import com.example.xutilsdemo.SocketConnectorMessager.SocketConnectorLinstre;import android.app.Service;import android.content.Intent;import android.os.IBinder;/** * socket服务 * @author double * */public class SocketCorserviceService extends Serviceimplements SocketConnectorLinstre{private SocketConnector socketConnector;private SocketConnectorMessager socketConnectorMessager;private ExecutorService exec=Executors.newFixedThreadPool(3); @Override public IBinder onBind(Intent intent) { return null; } @SuppressWarnings("unused") @Override public void onCreate() { super.onCreate(); socketConnectorMessager=SocketConnectorMessager.getConnectorMessager(); exec.execute(new Runnable() { public void run() { socketConnectorMessager.setSocketConnectorLinstre(SocketCorserviceService.this); socketConnectorMessager.connect("#A"); //socketConnector=new SocketConnector(); // socketConnector.setSocketConnectorLinstre(SocketCorserviceService.this); // socketConnector.connector();//连接, //socketConnector.Auth("#A");//认证 } }); } @Override public void notfiyData(String data) { Intent intent=new Intent(); intent.setAction(SocketPushBroadcastReservcer.ACTION_STRING); intent.putExtra(SocketPushBroadcastReservcer.DATA_KEY, data); sendBroadcast(intent);//发送广播 }}
广播监听
SocketPushBroadcastReservcer用于指定action动作
package com.example.xutilsdemo;import android.content.BroadcastReceiver;/** * 消息广播监听 * @author twj * */public abstract class SocketPushBroadcastReservcer extends BroadcastReceiver { public static final String ACTION_STRING="com.demo.action.text"; public static final String DATA_KEY="data";}
好了,吃饭去了,现在才去吃完饭,要源码的小伙伴留下邮箱
2016.05.29 .21 .34
3 0
- Socket实现两台手机通信,定向转发数据
- windows socket编程实现两台电脑间的通信
- android通过蓝牙实现两台手机传输数据
- 两台虚拟机Linux系统socket通信
- socket连接两台电脑通信java
- 简单的IPv6 UDP/TCP socket编程 -- 两台Linux实现简单的ipv6通信
- Erlang [1] 两台主机通信实现
- 【笔记】两台Android手机的Socket双向通信
- Rosmin--两台Android手机的Socket双向通信
- java socket 进行两台计算机之间的通信
- 两台Mysql数据库数据同步实现
- 两台Mysql数据库数据同步实现
- 两台Mysql数据库数据同步实现
- 两台Mysql数据库数据同步实现
- 触发器实现两台服务器数据同步
- 两台Mysql数据库数据同步实现
- mongodb实现两台数据库数据同步
- java实现两台计算机交互信息方法一Socket
- SOCKET API和TCP STATE的对应关系__三次握手(listen,accept,connect)__四次挥手close及TCP延迟确认(调用一次setsockopt函数,设
- 怎么判断百度网盘分享连接已经失效?其实没那么简单
- Minimum Size Subarray Sum
- java compiler level does not match the version of the installed java project facet
- 中国电话区号(CSV)
- Socket实现两台手机通信,定向转发数据
- Sticks<DFS>
- 实习小结
- jquery获取父窗口的元素
- 简单的K-means算法C语言实现代码
- 谷歌电子市场 day02(笔记)
- [主席树优化建图 最小割] BZOJ 3218 a + b Problem
- [ZooKeeper]ZooKeeper.multi的Op和OpResult
- 看了下微软更新的Win10系统,特地开了个UWP目录,与大家交流UWP开发