IPC 机制---使用Socket
来源:互联网 发布:查看交换机端口速率 编辑:程序博客网 时间:2024/05/16 02:07
IPC 机制---使用Socket
Socket 也称套接字 ,是网络通信中的概念,它分为流式套接字 和用户数据报套接字 两种
Socket 也称套接字 ,是网络通信中的概念,它分为流式套接字 和用户数据报套接字 两种
流式套接字 :对应于传输控制层的TCP协议 TCP协议 是面向连接的协议,提供稳定的双向通信功能,TCP的连接需要经过三次握手才能完成,为了提供稳定的数据传输功能,其本身提供了超时重传机制,因此具有很高的稳定性。
用户数据报套接字:对应于传输控制层的UDP协议,UDP是无连接的,提供不稳定的单向通信功能,当然UDP也可以实现双向通信功能。在性能上UDP具有更好的效率,其缺点是不能保证数据一定能够正确传输,尤其是在网络拥塞的情况下。
使用 Socket 来进行通信首先需要声明权限
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
其次不能够在主线程中访问网络,因为这会导致我们的程序无法在Android4.0 以上的设备运行。而且进行网络操作很可能是耗时的,如果放在主线程的中,会影响程序的响应效率。
服务端代码:
publicclassTCPServerServiceextendsService {
privatebooleanmIsServiceDestoryed=false;
privateString[]mDefinedMessages=newString[] {
"浣犲ソ鍟婏紝鍝堝搱",
"璇烽棶浣犲彨浠�涔堝悕瀛楀憖锛�",
"浠婂ぉ鍖椾含澶╂皵涓嶉敊鍟婏紝shy",
"浣犵煡閬撳悧锛熸垜鍙槸鍙互鍜屽涓汉鍚屾椂鑱婂ぉ鐨勫摝",
"缁欎綘璁蹭釜绗戣瘽鍚э細鎹鐖辩瑧鐨勪汉杩愭皵涓嶄細澶樊锛屼笉鐭ラ亾鐪熷亣銆�"
};
@Override
publicvoidonCreate() {
newThread(newTcpServer()).start();
super.onCreate();
}
@Override
publicIBinder onBind(Intent intent) {
returnnull;
}
@Override
publicvoidonDestroy() {
mIsServiceDestoryed=true;
super.onDestroy();
}
privateclassTcpServerimplementsRunnable {
@SuppressWarnings("resource")
@Override
publicvoidrun() {
ServerSocket serverSocket =null;
try{
serverSocket =newServerSocket(8688);
}catch(IOException e) {
System.err.println("establish tcp server failed, port:8688" );
e.printStackTrace();
return;
}
while(!mIsServiceDestoryed) {
try{
// 鎺ュ彈瀹㈡埛绔姹�
finalSocket client = serverSocket.accept();
System.out.println("accept");
newThread() {
@Override
publicvoidrun() {
try{
responseClient(client);
}catch(IOException e) {
e.printStackTrace();
}
};
}.start();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
privatevoidresponseClient(Socket client)throwsIOException {
// 用于接收客户端消息
BufferedReader in =newBufferedReader(newInputStreamReader(
client.getInputStream()));
// 用于向客户端发送消息
PrintWriter out =newPrintWriter(newBufferedWriter(
newOutputStreamWriter(client.getOutputStream())),true);
out.println("娆㈣繋鏉ュ埌鑱婂ぉ瀹わ紒");
while(!mIsServiceDestoryed) {
String str = in.readLine();
System.out.println("msg from client:" + str);
if(str ==null) {
//客户端断开连接
break;
}
inti =newRandom().nextInt(mDefinedMessages.length);
String msg =mDefinedMessages[i];
out.println(msg);
System.out.println("send :" + msg);
}
System.out.println("client quit." );
// 鍏抽棴娴�
MyUtils.close(out);
MyUtils.close(in);
client.close();
}
}
客户端代码:
publicclassTCPClientActivityextendsActivityimplementsOnClickListener {
privatestaticfinalintMESSAGE_RECEIVE_NEW_MSG= 1;
privatestaticfinalintMESSAGE_SOCKET_CONNECTED= 2;
privateButtonmSendButton;
privateTextViewmMessageTextView;
privateEditTextmMessageEditText;
privatePrintWritermPrintWriter;
privateSocketmClientSocket;
@SuppressLint("HandlerLeak")
privateHandlermHandler=newHandler() {
@Override
publicvoidhandleMessage(Message msg) {
switch(msg.what) {
caseMESSAGE_RECEIVE_NEW_MSG: {
mMessageTextView.setText(mMessageTextView.getText()
+ (String) msg.obj);
break;
}
caseMESSAGE_SOCKET_CONNECTED: {
mSendButton.setEnabled(true);
break;
}
default:
break;
}
}
};
@Override
protectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tcpclient);
mMessageTextView= (TextView) findViewById(R.id.msg_container);
mSendButton= (Button) findViewById(R.id.send);
mSendButton.setOnClickListener(this);
mMessageEditText= (EditText) findViewById(R.id.msg);
Intent service =newIntent(this, TCPServerService.class);
startService(service);
newThread() {
@Override
publicvoidrun() {
connectTCPServer();
}
}.start();
}
@Override
protectedvoidonDestroy() {
if(mClientSocket!=null) {
try{
mClientSocket.shutdownInput();
mClientSocket.close();
}catch(IOException e) {
e.printStackTrace();
}
}
super.onDestroy();
}
@Override
publicvoidonClick(View v) {
if(v ==mSendButton) {
finalString msg =mMessageEditText.getText().toString();
if(!TextUtils.isEmpty(msg) &&mPrintWriter!=null) {
mPrintWriter.println(msg);
mMessageEditText.setText("");
String time = formatDateTime(System.currentTimeMillis());
finalString showedMsg ="self "+ time +":"+ msg +"\n";
mMessageTextView.setText(mMessageTextView.getText() + showedMsg);
}
}
}
@SuppressLint("SimpleDateFormat")
privateString formatDateTime(longtime) {
returnnewSimpleDateFormat("(HH:mm:ss)").format(newDate(time));
}
privatevoidconnectTCPServer() {
Socket socket =null;
while(socket ==null) {
try{
socket =newSocket("localhost", 8688);
mClientSocket= socket;
mPrintWriter=newPrintWriter(newBufferedWriter(
newOutputStreamWriter(socket.getOutputStream())),true);
mHandler.sendEmptyMessage(MESSAGE_SOCKET_CONNECTED);
System.out.println("connect server success" );
}catch(IOException e) {
SystemClock.sleep(1000);
System.out.println("connect tcp server failed, retry..." );
}
}
try{
// 鎺ユ敹鏈嶅姟鍣ㄧ鐨勬秷鎭�
BufferedReader br =newBufferedReader(newInputStreamReader(
socket.getInputStream()));
while(!TCPClientActivity.this.isFinishing()) {
String msg = br.readLine();
System.out.println("receive :" + msg);
if(msg !=null) {
String time = formatDateTime(System.currentTimeMillis());
finalString showedMsg ="server "+ time +":"+ msg
+"\n";
mHandler.obtainMessage(MESSAGE_RECEIVE_NEW_MSG, showedMsg)
.sendToTarget();
}
}
System.out.println("quit...");
MyUtils.close(mPrintWriter);
MyUtils.close(br);
socket.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
0 0
- IPC 机制---使用Socket
- IPC机制--使用Socket
- IPC机制---使用AIDL
- IPC机制--使用ContentProvider
- 使用Socket实现安卓中IPC
- Unix Domain Socket– IPC通信机制
- Unix Domain Socket – IPC通信机制
- Android的IPC机制(七)—— Socket的原理简析与使用
- Android的IPC机制(七)—— Socket的原理简析与使用
- Android的IPC机制(七)—— Socket的原理简析与使用
- IPC机制之使用ContentProvider
- IPC机制--使用文件通信
- IPC:Socket
- IPC socket
- Linux下IPC机制之Socket通信总结
- 在Android使用AIDL实现IPC机制
- Android IPC机制之AIDL的使用
- android ipc机制之Messenger的使用
- fiddler filters 使用(fiddler只显示指定请求,fiddler不显示指定请求,即filter请求过滤)
- 小胖说swift03--------swift开发中的pch文件
- 数据结构实验之栈七:出栈序列判定
- Spring 注解学习手札(二) 控制层梳理
- POJ C Looooops 2115 (扩展欧几里得)
- IPC 机制---使用Socket
- 华创网表v6.8无捆绑官方正式版
- Occlusion-free Face Alignment: Deep Regression Networks Coupled with De-corrupt AutoEncoders阅读笔记
- 解决u-blox在u-center中无法显示北斗卫星的问题
- Socket的基础编程(三)
- bzoj1087[SCOI2005]互不侵犯King
- 关于Spring Boot下Spring Security权限访问设置@PreAuthorize("hasRole('ROLE_ADMIN')")没有用
- 异步压力测试探索:什么是异步非阻塞
- JS改变字体,大、中、小