如何实现两台PC机socket实现进程间通信通信

2047人阅读
ROS开发(6)
& & & &上学期搞定了小车,现在终于结束了大机器人,趁还没真正进入考研复习的高潮赶紧把以前的代码整理整理。
& & & &先讲讲我们那小车,2台手机+车体组成。一个手机放车上作为server,用其摄像头、陀螺仪、磁力计来获取图像、确定小车方向。另一台手机负责控制,作为client,并画出小车行进图。如何从server获取陀螺仪、磁力计角度,又如何把client的控制命令发送给server就成了一个问题。这里我们使用socket双向通信。
& & & &先讲client部分
// Socket Client connect to Server
connectButton.setOnClickListener(new Button.OnClickListener()
public void onClick(View v)
// TODO Auto-generated method stub
ip = mEditText02.getText().toString();
Thread thread = new Thread(new mSocketConnectRunnable2());
thread.start();
thread.sleep(100);
goToControl();
//进行控制命令的处理
connectButton.setVisibility(View.INVISIBLE);
mEditText02.setVisibility(View.INVISIBLE);
catch (Exception e)
e.printStackTrace();
& & & 两台手机都连接到同个wifi,这个就不多讲了。首先你得有个EditText填写server的IP地址,然后有个按钮,点击启动个线程,负责与server通信,这里传给Thread的构造函数调用Runnable接口。socket其实就是对某一个服务器的一个端口进行连接,连接上后就形成会话。由于这里socket是全双向的字节流,所以连上的时候其本身就已经具备了双向通信能力。
& & & 然后我们看它调用的接口,怎么连接和接受server发来的数据……
//Socket Client
public class mSocketConnectRunnable2 implements Runnable
public void run()
mSocket02 = new Socket(ip, intSocketServerPort);
if(mSocket02.isConnected())
Log.i(TAG, &Socket Client is connected to Server.&);
strTemp01=&Socket Client is connected to Server.&;
BufferedReader br = new BufferedReader(new InputStreamReader(mSocket02.getInputStream()));
while (true)
strTemp01 = br.readLine();
if(!strTemp01.isEmpty())
handler.post(rReceiveInfo);
catch(Exception e)
if(bIfDebug)
Log.e(TAG, e.toString());
e.printStackTrace();
& & & & &ip上面说了,intSocketServerPort是socket端口,我这里设置为8080。mSocket02就像个水管,可以往里灌水也可以抽水。这里通过BufferedReader获得字节流,用handler传递进行数据处理。这里推荐用handler,不仅增加代码可度性,更容易避免莫名其妙的bug……
& & & & 以上是建立socket连接并且从server获取字节流的过程,下面是发送字节流的部分……
public static void action(String a){
//当Socket连接正常且不为空时,流输出给server
if(mSocket02!=null && mSocket02.isConnected() && !a.equals(&&))
bw = new BufferedWriter(new OutputStreamWriter(mSocket02.getOutputStream()));
bw.write(a+&\n&);
bw.flush();
catch (Exception e)
Log.e(TAG, e.toString());
e.printStackTrace();
& & & & &这里,比如我用 action(&forward&),则字节流将forward发往server,至于这里流输出,不过多解释,详细的需要自己仔细查看socket。
& & & & &然后是server部分……这里我们设置一个按钮用于开启socket server
// Run Socket Server
mButton01.setOnClickListener(new Button.OnClickListener()
public void onClick(View v)
// TODO Auto-generated method stub
mButton01.setEnabled(false);
mButton02.setEnabled(true);
setContentView(R.layout.i3);
Thread thread = new Thread(new mSocketConnectRunnable1());
thread.start();
& & & & &这里也是用Thread的构造函数调用Runnable接口
//Socket Server
public class mSocketConnectRunnable1 implements Runnable
public void run()
// TODO Auto-generated method stub
mServerSocket01 = new ServerSocket(intSocketServerPort);
mServerSocket01.setReuseAddress(true);
Log.i(TAG, strDebugPreFix+&Socket Server is Running: &+intSocketServerPort);
while (!mServerSocket01.isClosed())
mSocket01 = mServerSocket01.accept();
Thread read = new Thread(new Runnable()
BufferedReader br = new BufferedReader(new InputStreamReader(mSocket01.getInputStream()));
public void run()
while (mSocket01.isConnected())
msg = br.readLine();
Handler01.post(rManualControl);
catch (Exception e)
if(bIfDebug)
Log.e(TAG, e.toString());
e.printStackTrace();
read.start();
//在接受数据的同时发送数据,实现双向通信
Thread write = new Thread (new Runnable()
public void run()
while (mSocket01.isConnected())
Thread.sleep(100);
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();
Handler01.post(rSendStr);
write.start();
catch(Exception e)
if(bIfDebug)
Log.e(TAG, e.toString());
e.printStackTrace();
&public Runnable rSendStr = new Runnable(){
public void run()
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(mSocket01.getOutputStream()) );
strMove = strMoveFlag
+ String.valueOf((int) gyrAngle)
+ & & + String.valueOf( ( ((int)corrected_a) +((accX&3)?90:180) )%360)
//由于小车姿态问题,需要进行修正
+ & & + strQR
bw.write(strMove);
bw.flush();
strQR = &0&; // accX&3
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
&& &这里用了read write两个thread,分别负责流输入和流输出。这里唯独要提的就是write部分,加上sleep控制流输出频率,不然会造成堵塞。将BufferedWriter通过handler放到Runnable中解决莫名其妙的问题(我的基础不行……惭愧惭愧……)。
PS:用handler解决部分问题,多亏了队友sununs11.这里是我们组项目中截下的代码,会有很多无关于本文双向通信的代码,请无视……后续会放出全部代码与代码解释……这代码是干什么的???请看这个简短视频:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:25450次
排名:千里之外
评论:22条为了账号安全,请及时绑定邮箱和手机
如何实现不在局域网内的两台电脑上的通信,模拟qq的
通过Socket,写的两个服务器与客户机程序,不能实现分别在两个台电脑上进行通信,该如何改正
写下你的评论...
写下你的评论...
写下你的评论...
Copyright (C)
All Rights Reserved | 京ICP备 号-2您的举报已经提交成功,我们将尽快处理,谢谢!
可以在系统里安装个虚拟机,这样就拥有多个IP地址了,就可以给服务器发数据了
XP系统如果是固定IP,从控制面板-网络连接-本地连接-属性-internet协议(TCP/IP)-属性,就看到自己的IP,也可设置自己的IP。
如果是自...
不是那是一种网络协议如果要局联红警的话,需要安装这个协议
一般来讲,一台电脑一个IP,但有人会以为,一台计算机只能有一个IP地址,这种观点是错误的。我们可以指定一台计算机具有多个IP地址,因此在访问互联网时,不要以为一...
双机互联的方法及操作
网卡是目前使用最多地连网设备,在双机互联的解决方案中, 网卡也是速度最快的一种。我们通过在两台计算机中分别安装一块 网卡,通过细...
大家还关注Android开发(24)
最近要面试了,想练习一下网络编程吧,想想来搞搞实现太手机聊天功能吧,其实聊天功能有集成好的框架,有apache的mina框架,想要知道这个框架怎么用,看我的下一篇博客吧,现在我们开讲讲怎么用socket通信吧
首先,什么叫socket?字面意思叫 插座; 灯座; 窝,穴; [解] 眼窝,孔窝
网络用语叫套接字原理是基于tcp/ip 协议的一种通信手段,
下面来看我的客户端程序吧,首先新建一个java工程。里面就有一个类用于客户端提供服务;
import java.io.IOE
import java.io.InputS
import java.io.OutputS
import java.net.ServerS
import java.net.S
import java.util.LinkedHashM
import java.util.LinkedL
import java.util.L
import java.util.M
import java.util.concurrent.ExecutorS
import java.util.concurrent.E
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;
@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() {
public void run() {
InputStream inputStream=socket.getInputStream();
OutputStream outputStream=socket.getOutputStream();
byte[] buffer=new byte[1024];
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());
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"));
} catch (Exception e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
服务端代码其实很简单,只要提供认证和类容就可以转发给指定的手机客户端了,下面我们来看看客户端代码吧,客户端其进入程序,就应该发一个认证连接服务端,然后在在客户端开启一个连接池。当有消息发送到大的是时候必须转发。这种东西就要写在service里面,然后定义动态广播,具体代码如下
activity类显示
package com.example.
import java.io.IOE
import java.io.InputS
import java.io.OutputS
import java.net.S
import java.net.UnknownHostE
import java.util.concurrent.ExecutorS
import java.util.concurrent.E
import javax.security.auth.PrivateCredentialP
import com.lidroid.xutils.ViewU
import com.lidroid.xutils.view.annotation.ViewI
import com.lidroid.xutils.view.annotation.event.OnC
import android.app.A
import android.content.C
import android.content.I
import android.content.IntentF
import android.os.B
import android.text.TextU
import android.util.L
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.EditT
import android.widget.T
public class SocketActivity extends Activity{
@ViewInject(R.id.but_login)
private Button but_
@ViewInject(R.id.edit_context)
private EditText edit_
private String ip="10.188.20.129";
private int port=1001;
* 监听广播
private SocketPushBroadcastReservcer spbr=new SocketPushBroadcastReservcer() {
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();
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);
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(spbr);
@OnClick(R.id.but_login)
public void but_login(View v){
if (TextUtils.isEmpty(edit_context.getText())) {
ExecutorService executorService=Executors.newFixedThreadPool(2);
executorService.execute(new Runnable() {
public void run() {
SocketConnectorMessager.getConnectorMessager().
putRequest(edit_context.getText().toString().trim());
} catch (Exception e1) {
e1.printStackTrace();
提供服务类
SocketConnector
package com.example.
import java.io.IOE
import java.io.InputS
import java.io.OutputS
import java.net.S
import java.util.concurrent.ArrayBlockingQ
import java.util.concurrent.BlockingQ
import java.util.concurrent.ExecutorS
import java.util.concurrent.E
* socket 类容提供者
public class SocketConnector {
private String ip="10.188.20.129";
private int port=1001;
SocketConnectorLinstre soL
private ArrayBlockingQueue&String& queue=new ArrayBlockingQueue&&(8);
public SocketConnector(){
private class RwquestWork implements Runnable{
public void run() {
OutputStream outputStream=socket.getOutputStream();
while (true) {
String context=queue.take();
outputStream.write(context.getBytes("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
public void putRequest(String context){
System.out.println("&&&&&&&&&"+context);
queue.put(context);
System.out.println("queue.take()"+queue.take());
} catch (Exception e) {
e.printStackTrace();
public void connector(){
if (null==socket||socket.isClosed()){
socket=new Socket(ip, port);
new Thread(new RwquestWork()).start();
ExecutorService executorService=Executors.newFixedThreadPool(3);
executorService.execute(new Runnable() {
public void run() {
InputStream inputStream=socket.getInputStream();
byte[] buffer=new byte[1024];
while ((len=inputStream.read(buffer))!=-1) {
final String request=new String(buffer,0,len);
if (null!=soLinstre) {
soLinstre.notfiyData(request);
} catch (Exception e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
public void disConnector(){
if (null==socket||socket.isClosed()){
socket.close();
socket=null;
} catch (IOException e) {
e.printStackTrace();
void Auth(String auth){
OutputStream outputS
outputStream = socket.getOutputStream();
outputStream.write(auth.getBytes("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
public void setSocketConnectorLinstre(SocketConnectorLinstre soLinstre ){
this.soLinstre=soL
public interface SocketConnectorLinstre{
public void notfiyData(String data);
SocketConnectorMessager类主要用于认证
package com.example.
import com.example.xutilsdemo.SocketConnector.SocketConnectorL
* 消息提供者
public class SocketConnectorMessager implements SocketConnectorLinstre{
private static
SocketConnectorM
private SocketConnector socketC
private SocketConnectorLinstre soL
private SocketConnectorMessager(){
public static SocketConnectorMessager getConnectorMessager(){
messager=new SocketConnectorMessager();
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);
public void notfiyData(String data) {
if (soLinstre!=null) {
soLinstre.notfiyData(data);
public void setSocketConnectorLinstre(SocketConnectorLinstre soLinstre ){
this.soLinstre=soL
public interface SocketConnectorLinstre{
public void notfiyData(String data);
SocketCorserviceService后台服务类
package com.example.
import java.util.concurrent.ExecutorS
import java.util.concurrent.E
import com.example.xutilsdemo.SocketConnectorMessager.SocketConnectorL
import android.app.S
import android.content.I
import android.os.IB
* socket服务
public class SocketCorserviceService extends Service
implements SocketConnectorLinstre{
private SocketConnector socketC
private SocketConnectorMessager socketConnectorM
private ExecutorService exec=Executors.newFixedThreadPool(3);
public IBinder onBind(Intent intent) {
return null;
@SuppressWarnings("unused")
public void onCreate() {
super.onCreate();
socketConnectorMessager=SocketConnectorMessager.getConnectorMessager();
exec.execute(new
Runnable() {
public void run() {
socketConnectorMessager.setSocketConnectorLinstre(SocketCorserviceService.this);
socketConnectorMessager.connect("#A");
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.
import android.content.BroadcastR
* 消息广播监听
public abstract class SocketPushBroadcastReservcer extends BroadcastReceiver {
public static final String ACTION_STRING="com.demo.action.text";
public static final String DATA_KEY="data";
好了,吃饭去了,现在才去吃完饭,要源码的小伙伴留下邮箱
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:46539次
积分:1638
积分:1638
排名:第19468名
原创:85篇
转载:20篇
评论:195条
(11)(11)(18)(7)(4)(8)(17)(18)(8)(4)

我要回帖

更多关于 socket实现一对一通信 的文章

 

随机推荐