简单的socket通信(怎样使用socket来实现简单的点对点通信)
本文目录
怎样使用socket来实现简单的点对点通信
要用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 {31 ServerSocket ss = null;32 String mClientMsg = "";33 Thread myCommsThread = null;34 protected static final int MSG_ID = 0x1337;35 public static final int SERVERPORT = 6000;36 37 @Override38 public 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 @Override48 protected void onStop() {49 super.onStop();50 try {51 // 确保你退出时要关闭socket连接52 ss.close();53 } catch (IOException e) {54 e.printStackTrace();55 }56 }57 58 Handler 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 };71 class 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 {21 private Button bt;22 private TextView tv;23 private Socket socket;24 private String serverIpAddress = "192.168.1.104";25 26 private static final int REDIRECTED_SERVERPORT = 6000;27 @Override28 public 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 {44 EditText et = (EditText) findViewById(R.id.EditText01);45 String str = et.getText().toString();46 PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);47 out.println(str);48 Log.d("Client", "Client sent message");49 } catch (UnknownHostException e) {50 tv.setText("Error1");51 e.printStackTrace();52 } catch (IOException e) {53 tv.setText("Error2");54 e.printStackTrace();55 } catch (Exception e) {56 tv.setText("Error3");57 e.printStackTrace();58 }59 }60 });61 }62 }通过以上的学习,大家可以系统的整理一下具体的操作流程,达内科技是您永远的老师和朋友,如果您还有其他疑问也可以随时关注我们的网页更新内容,达内有很多的信息愿与大家共享。
一个最简单的Socket通信例子
所谓socket通常也称作 套接字 用于描述IP地址和端口 是一个通信链的句柄 应用程序通常通过 套接字 向网络发出请求或者应答网络请求 Socket和ServerSocket类库位于包中 ServerSocket用于服务器端 Socket是建立网络连接时使用的 在连接成功时 应用程序两端都会产生一个Socket实例 操作这个实例 完成所需的会话 对于一个网络连接来说 套接字是平等的 并没有差别 不因为在服务器端或在客户端而产生不同级别 不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的
下面给出一个最简单的Socket通信的例子供初学者参考
服务器端 ServerDemo java
package lanber socket;
import java io DataInputStream;import java io DataOutputStream;import java io IOException;import ServerSocket;import Socket;
public class ServerDemo {
/** * 注意 Socket的发送与接收是需要同步进行的 即客户端发送一条信息 服务器必需先接收这条信息 * 而后才可以向客户端发送信息 否则将会有运行时出错 * @param args */ public static void main(String args) { ServerSocket ss = null; try { ss = new ServerSocket( ); //服务器接收到客户端的数据后 创建与此客户端对话的Socket Socket socket = ss accept(); //用于向客户端发送数据的输出流 DataOutputStream dos = new DataOutputStream(socket getOutputStream()); //用于接收客户端发来的数据的输入流 DataInputStream dis = new DataInputStream(socket getInputStream()); System out println( 服务器接收到客户端的连接请求 + dis readUTF()); //服务器向客户端发送连接成功确认信息 dos writeUTF( 接受连接请求 连接成功! ); //不需要继续使用此连接时 关闭连接 socket close(); ss close(); } catch (IOException e) { e printStackTrace(); } }
客户端 ClientDemo java
package lanber socket;
import java io DataInputStream;import java io DataOutputStream;import java io IOException;import java io OutputStream;import Socket;import UnknownHostException;
public class ClientDemo {
/** * @param args */ public static void main(String args) { Socket socket = null; try { socket = new Socket( localhost ); //获取输出流 用于客户端向服务器端发送数据 DataOutputStream dos = new DataOutputStream(socket getOutputStream()); //获取输入流 用于接收服务器端发送来的数据 DataInputStream dis = new DataInputStream(socket getInputStream()); //客户端向服务器端发送数据 dos writeUTF( 我是客户端 请求连接! ); //打印出从服务器端接收到的数据 System out println(dis readUTF()); //不需要继续使用此连接时 记得关闭哦 socket close(); } catch (UnknownHostException e) { e printStackTrace(); } catch (IOException e) { e printStackTrace(); } }
}
lishixinzhi/Article/program/Java/gj/201311/27357
java 简单的socket通信
最简单的就是将dins.readUTF()方法换成dins.readLine(),出错的原因是到达流的末尾导致的意外终止。你会发现readLine()方法已经是废弃方法,不建议使用了。比较常规的方法是使用BufferedReader br= new BufferedReader(new InputStreamReader(ins)); 来替代DataInputStream祝你好运!
门外汉 求c++ 解释代码 简单socket 通信
#include "stdafx.h"#include《Winsock2.h》#include《stdio.h》#include《stdlib.h》#define PORT 5000int main(int argc, char* argv){int port=PORT;WSADATA wsaData;SOCKET sListen,sAccept; int iLen; int iSend; char buf="您好!"; //服务器、客户的地址struct sockaddr_in serv,cliet; //声明两个地址结构体变量if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf("Winsock load failed\n");//return;} //加载套接字库 //创建一个套接字 AD_INET(IPV4协议) SOCK_STREAM(TCP协议)sListen=socket(AF_INET,SOCK_STREAM,0); //判断是否失败if(sListen==INVALID_SOCKET){printf("socket failed:%d\n",WSAGetLastError());return;}为服务器的地址结构体赋值serv.sin_family=AF_INET; //必须和创建套接字时候一样(socket)serv.sin_port=htons(port); //端口 htons转换为网络字节序serv.sin_addr.s_addr=htonl(INADDR_ANY); //绑定的地址 htonl转换为网络字节序//INADDR_ANY 默认的网卡地址 本机 if(bind(sListen,(LPSOCKADDR)&serv,sizeof(serv))==SOCKET_ERROR){printf("bind()failed:%d\n",WSAGetLastError());return;}//bind 绑定地址 并且判断是否成功 if(listen(sListen,5)==SOCKET_ERROR) {printf("listen()failed:%d\n",WSAGetLastError());return;}//监听 并且判断是否成功 iLen=sizeof(cliet); 得到地址结构体的长度 accept函数需要//循环简体客户连接while(1) {sAccept=accept(sListen,(struct sockaddr*)&cliet,&iLen); //accept阻塞 知道有新的连接if(sAccept==INVALID_SOCKET){printf("accept()failed:%d\n",WSAGetLastError());break;}printf("accepted client IP:\n",inet_ntoa(cliet.sin_addr),ntohs(cliet.sin_port)); //给连接的客户发送信息iSend=send(sAccept,buf,sizeof(buf),0); if(iSend==SOCKET_ERROR){printf("send()failed:%d\n",WSAGetLastError());break;}else if(iSend==0)break;elseprintf("send()byte:%d\n",send);closesocket(sAccept);}closesocket(sListen);//关闭套接字WSACleanup();//关闭套接字库}=============================================client端代码#include "stdafx.h"#include《Winsock2.h》#include《stdio.h》#define PORT 5000#define BUFFER 1024void main(int argc,char *argv){WSADATA wsaData;SOCKET client;int port=PORT; int iLen; char buf; struct sockaddr_in serv; memset(buf,0,sizeof(buf)); if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf("Winsock load failed\n");return;} 为地址结构体赋值serv.sin_family=AF_INET; //地址族 和上面一样serv.sin_port=htons(port); //服务端监听的端口serv.sin_addr.s_addr=inet_addr("192.168.0.1"); //这应该是服务端的IP地址client=socket(AF_INET,SOCK_STREAM,0); //创建 套接字if(client==INVALID_SOCKET) //判定是否成功{printf("socket()failed:%d\n",WSAGetLastError());return;}//连接服务器 并且判断是否成功if(connect(client,(struct sockaddr*)&serv,sizeof(serv))==INVALID_SOCKET) {printf("connet()failed:%d\n",WSAGetLastError());return;}else{ iLen=recv(client,buf,sizeof(buf),0); //recv读取消息if(iLen==0) return;else if(iLen==SOCKET_ERROR){printf("recv()failed:%d\n",WSAGetLastError());return;}printf("recv()data from server:%s\n",buf);}closesocket(client); 关闭套接字WSACleanup();关闭套接字库printf("press any key to continue"); while(1);//防止程序退出}
更多文章:
大智慧交易软件官方免费下载(国泰君安大智慧软件官方下载 国泰君安大智慧5.99下载)
2024年9月30日 04:50
vb6 0中文企业版(vb6.0中文企业版安装 这该怎么办呐)
2024年7月7日 17:24
120平米花6万装修效果(装修中120平装修6万块钱包括哪些项目)
2024年7月2日 23:31
ios十大耐玩单机游戏(10款iOS经典游戏推荐:精品单机游戏盘点,游戏荒别错过)
2024年7月9日 20:50
primerpremier(ipad如何安装primerpremier)
2024年5月4日 03:06