怎样使用socket来实现简单的点对点通信

Python014

怎样使用socket来实现简单的点对点通信,第1张

要用android实现点对点通信,可以使用socket完成,使用socket需要知道对方的IP地址以及端口号,这里我省略了服务器端(编写正规的通信软件还是得需要服务器做中转,用服务器得知A的IP地址,然后让A做服务器端,B用A的Ip地址去获取数据),只是展示相关原理,首先看服务器端

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))这里面。