1 package polly.liu
2
3 import java.io.BufferedReader
4 import java.io.IOException
5 import java.io.InputStreamReader
6 import java.net.InetAddress
7 import java.net.NetworkInterface
8 import java.net.ServerSocket
9 import java.net.Socket
10 import java.net.SocketException
11 import java.util.Enumeration
12
13 import android.app.Activity
14 import android.os.Bundle
15 import android.os.Handler
16 import android.util.Log
17 import android.widget.TextView
18
19 import java.io.BufferedReader
20 import java.io.IOException
21 import java.io.InputStreamReader
22 import java.net.ServerSocket
23 import java.net.Socket
24 import android.app.Activity
25 import android.os.Bundle
26 import android.os.Handler
27 import android.os.Message
28 import android.widget.TextView
29
30 public class ServerActivity extends Activity {
31ServerSocket ss = null
32String mClientMsg = ""
33Thread myCommsThread = null
34protected static final int MSG_ID = 0x1337
35public static final int SERVERPORT = 6000
36
37@Override
38public void onCreate(Bundle savedInstanceState) {
39 super.onCreate(savedInstanceState)
40 setContentView(R.layout.main)
41 TextView tv = (TextView) findViewById(R.id.TextView01)
42 tv.setText("Nothing from client yet")
43 this.myCommsThread = new Thread(new CommsThread())
44 this.myCommsThread.start()
45}
46
47@Override
48protected void onStop() {
49 super.onStop()
50 try {
51 // 确保你退出时要关闭socket连接
52 ss.close()
53 } catch (IOException e) {
54 e.printStackTrace()
55 }
56}
57
58Handler myUpdateHandler = new Handler() {
59 public void handleMessage(Message msg) {
60 switch (msg.what) {
61 case MSG_ID:
62 TextView tv = (TextView) findViewById(R.id.TextView01)
63 tv.setText(mClientMsg)
64 break
65 default:
66 break
67 }
68 super.handleMessage(msg)
69 }
70}
71class CommsThread implements Runnable {
72 public void run() {
73 Socket s = null
74 try {
75 ss = new ServerSocket(SERVERPORT )
76 } catch (IOException e) {
77 e.printStackTrace()
78 }
79 while (!Thread.currentThread().isInterrupted()) {
80 Message m = new Message()
81 m.what = MSG_ID
82 try {
83 if (s == null)
84 s = ss.accept()
85 BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()))
86 String st = null
87 st = input.readLine()
88 mClientMsg = st
89 myUpdateHandler.sendMessage(m)
90 } catch (IOException e) {
91 e.printStackTrace()
92 }
93 }
94 }
95 }
96 }
服务器端和平时在PC上的代码差不多,只不过现在把在PC上的代码转到了手机端,注意耗时间的操作要放在子线程上去做,再来看看客户端代码:
1 package polly.liu
2
3 import java.io.BufferedWriter
4 import java.io.IOException
5 import java.io.OutputStreamWriter
6 import java.io.PrintWriter
7 import java.net.InetAddress
8 import java.net.Socket
9 import java.net.UnknownHostException
10
11 import android.app.Activity
12 import android.os.Bundle
13 import android.util.Log
14 import android.view.View.OnClickListener
15 import android.widget.Button
16 import android.widget.EditText
17 import android.widget.TextView
18 import android.view.View
19
20 public class ClientActivity extends Activity {
21private Button bt
22private TextView tv
23private Socket socket
24private String serverIpAddress = "192.168.1.104"
25
26private static final int REDIRECTED_SERVERPORT = 6000
27@Override
28public void onCreate(Bundle savedInstanceState) {
29 super.onCreate(savedInstanceState)
30 setContentView(R.layout.main)
31 bt = (Button) findViewById(R.id.myButton)
32 tv = (TextView) findViewById(R.id.myTextView)
33 try {
34 InetAddress serverAddr = InetAddress.getByName(serverIpAddress)
35 socket = new Socket(serverAddr, REDIRECTED_SERVERPORT)
36 } catch (UnknownHostException e1) {
37 e1.printStackTrace()
38 } catch (IOException e1) {
39 e1.printStackTrace()
40 }
41 bt.setOnClickListener(new OnClickListener() {
42 public void onClick(View v) {
43 try {
44EditText et = (EditText) findViewById(R.id.EditText01)
45String str = et.getText().toString()
46PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true)
47out.println(str)
48Log.d("Client", "Client sent message")
49 } catch (UnknownHostException e) {
50tv.setText("Error1")
51e.printStackTrace()
52 } catch (IOException e) {
53tv.setText("Error2")
54e.printStackTrace()
55 } catch (Exception e) {
56tv.setText("Error3")
57e.printStackTrace()
58 }
59 }
60 })
61}
62 }
通过以上的学习,大家可以系统的整理一下具体的操作流程,达内科技是您永远的老师和朋友,如果您还有其他疑问也可以随时关注我们的网页更新内容,达内有很多的信息愿与大家共享。
用socket实现进程通信 ,和socket的普通用法一样,只不过服务端IP为127.0.0.1 而已
下面附上代码示例:
//服务器端代码 进程1#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int sock
//sendto中使用的对方地址
struct sockaddr_in toAddr
//在recvfrom中使用的对方主机地址
struct sockaddr_in fromAddr
int recvLen
unsigned int addrLen
char recvBuffer[128]
sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)
if(sock < 0)
{
printf("创建套接字失败了.\r\n")
exit(0)
}
memset(&fromAddr,0,sizeof(fromAddr))
fromAddr.sin_family=AF_INET
fromAddr.sin_addr.s_addr=htonl(INADDR_ANY)
fromAddr.sin_port = htons(4000)
if(bind(sock,(struct sockaddr*)&fromAddr,sizeof(fromAddr))<0)
{
printf("bind() 函数使用失败了.\r\n")
close(sock)
exit(1)
}
while(1){
addrLen = sizeof(toAddr)
if((recvLen = recvfrom(sock,recvBuffer,128,0,(struct sockaddr*)&toAddr,&addrLen))<0)
{
printf("()recvfrom()函数使用失败了.\r\n")
close(sock)
exit(1)
}
if(sendto(sock,recvBuffer,recvLen,0,(struct sockaddr*)&toAddr,sizeof(toAddr))!=recvLen){
printf("sendto fail\r\n")
close(sock)
exit(0)
}
return 0
}
} //客户端代码 进程2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>int main(int argc, char *argv[])
{
if(argc < 2)
{
printf("请输入要传送的内容.\r\n")
exit(0)
}
int sock
//sendto中使用的对方地址
struct sockaddr_in toAddr
//在recvfrom中使用的对方主机地址
struct sockaddr_in fromAddrunsigned int fromLen
char recvBuffer[128]
sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)if(sock < 0)
{
printf("创建套接字失败了.\r\n")
exit(1)
}memset(&toAddr,0,sizeof(toAddr))
toAddr.sin_family=AF_INET
toAddr.sin_addr.s_addr=inet_addr("127.0.0.1")
toAddr.sin_port = htons(4000)if(sendto(sock,argv[1],strlen(argv[1]),0,(struct sockaddr*)&toAddr,sizeof(toAddr)) != strlen(argv[1]))
{
printf("sendto() 函数使用失败了.\r\n")
close(sock)
exit(1)
}fromLen = sizeof(fromAddr)
if(recvfrom(sock,recvBuffer,128,0,(struct sockaddr*)&fromAddr,&fromLen)<0)
{
printf("()recvfrom()函数使用失败了.\r\n")
close(sock)
exit(1)
}
printf("recvfrom() result:%s\r\n",recvBuffer)
close(sock)}
你是每一次都要重新连接一下你的发送端,发送端会accept两次。那你的接收端 在while内要closesocket(sockClient)呢? 你close了 还怎么连呢?
你在connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))这里面。