如何用 socket建立一个实时接收服务器数
# -- coding: utf-8 --
# -- version: beta-00 --
####################################################################################################
import socket
####################################################################################################
class Main():
def __init__(self):
selfhost = '127001'
selfport = 9999
#--------------------------------------------------------------------------------------------------#
def Start(self):
clientSock = socketsocket(socketAF_INET, socketSOCK_STREAM)
clientSockconnect((selfhost, selfport))
while True:
clientSocksend(b'hello')
dataRecv = clientSockrecv(1024)
if not dataRecv:
break
clientSockclose()
####################################################################################################
def test():
m = Main()
mStart()
if __name__ == '__main__':
test()
上面的做法是CONNECT后使用 SOCKET循环接收,如果需要循环CONNECT,WHILE TURE改到CONNECT之前就行了,另外注意CLOSE SOCKET。
hi,帅哥。我无法清晰的理解你的问题。为了便于理解,我们先把一个应用分一下层次,然后再讨论一下你需要在哪个层次上工作。首先,针对你提到的应用我们可以分成“协议层”,“中间层”,“业务层”“协议层”是指实现The WebSocket Protocol(RFC6455)的代码部分。其中Client端规范已经有支持WebSocket的浏览器实现了,估计不需要自己做client端吧。而Server端规范也有一些第三方的实现,例如:Kaazing,Netty。如果你没有也不想使用第三方提供的Server那么就需要自己写一个了。\"中间层\"是指基于协议层之上的辅助实现应用逻辑的框架。好像Netty就包含这样的框架。当然如果你不需要也可以直接忽略。\"业务层\"是指具体实现业务需求的代码部分,例如你提到的“登录”。那么现在请问你需要的是仅仅实现\"业务层\"的登录逻辑?还是服务端的协议?看到你已经有一个服务器,那么上面是否已经有了完整可用的服务器端代码?是否只需要实现客户端逻辑就可以了呢?
Android客户端与PC服务器实现Socket通信(wifi)
本文介绍Android终端持续扫描AP信息并发送给服务器端的实现。首先基于TCP协议在Android终端和PC两端之间形成网络虚拟链路。使用ServerSocket创建TCP服务器端,然后在Android客户端使用Socket的构造器来连接服务器。其中Android终端通过WIFI连接和PC处于同一局域网。
1
PC服务器启用ServerSocket
两个通信实体在建立虚拟链路之前,需要有一方先准备好,主动接受来自其他通信实体的连接请求。
使用ServerSocket对象监听来自客户端的Socket连接
//创建ServerSocket对象
//by wayne from wwwcnblogcom/dwayne/
ServerSocket ss = new ServerSocket(30000);
//监听来自客户端的请求
while(true){
Socket s = ssaccept();
…
}
如果没有连接,则将一直处于等待状态。
当接收到连接请求后,获取消息到输入流,并保存到文件。
//接收客户端消息
//by wayne from wwwcnblogcom/dwayne/
BufferedReader in = new BufferedReader(new
InputStreamReader(clientgetInputStream()));
String str;
BufferedWriter bw = new BufferedWriter(new FileWriter("D:/ApInfo"+ (i++)
+"txt"));
while ((str = inreadLine()) != null) {
Systemoutprintln(str);
bwwrite(str);
bwnewLine();
}
2
Android终端使用Socket通信
客户端使用Socket的构造器连接服务器,指定服务器IP和端口号就可以了。
Socket s = new
Socket(“1921681100”, 30000);
这样服务器端的accept()方法就得到响应,从而向下执行,服务器端和客户端就形成了一对互相连接的Socket。再进行通信时就没有服务器和客户端之分了,都是通过输入输出流进行通信。
详细步骤
采用Handler和TimerTask来定时扫描AP信息并发送给服务器端。
TimerTask规定了到达指定的时间所要进行的任务。
TimerTask task = new TimerTask(){
public void run() {
Message message = new Message();
messagewhat = 1;
handlersendMessage(message);
}
};
handler传递message内容:
Handler handler = new Handler(){
public void handleMessage(Message msg) {
switch (msgwhat) {
case 1:
// 执行定时器时间到了之后由handler传递的任务
break;
}
superhandleMessage(msg);
}
};
因为需要持续执行扫描任务,所以启用新线程执行定时任务
//启动单独线程定时向服务器发送AP信息
//by wayne from wwwcnblogscom/dwayne
new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
timerschedule(task, 2000,10000); //在2秒后每10秒执行一次定时器中的方法
}
}start();
接下来扫描AP信息并发送给服务器端,然后将结果保存。
WifiManager wifiManager=(WifiManager) getSystemService(WIFI_SERVICE);
wifiManagerstartScan();
mWifiList = wifiManagergetScanResults();
由WifiManager说明可知,它可以用于处理已配置的网络,当前连接的网络及AP信息的扫描等情况。
This class provides the primary API for managing all aspects of
Wi-Fi connectivity Get an instance of this class by calling
ContextgetSystemService(ContextWIFI_SERVICE) It deals with several categories
of items:
The list of configured networks The list can be viewed and updated, and
attributes of individual entries can be modified
The currently active Wi-Fi network, if any Connectivity can be established
or torn down, and dynamic information about the state of the network can be
queried
Results of access point scans, containing enough information to make
decisions about what access point to connect to
It defines the names of various Intent actions that are broadcast upon any
sort of change in Wi-Fi state
向服务器发送消息:
socket = new Socket("1921681211",30000);
//向服务器端发送消息
PrintWriter out = new PrintWriter( new BufferedWriter( new
OutputStreamWriter(socketgetOutputStream())),true);
outprintln(message);
其中message为获取的AP信息
测试收到的信息格式为:
SSID: ICIS_LAB, BSSID: 1c:af:f7:9a:65:e4, capabilities:
[WPA-PSK-TKIP+CCMP], level: -80, frequency: 2
进入mysql,创建一个新用户xuys:
格式:grant 权限 on 数据库名表名 用户@登录主机 identified by "用户密码";
grant select,update,insert,delete on to xuys@19216888234 identified by "xuys1234";
查看结果,执行:
use mysql;
select host,user,password from user;
可以看到在user表中已有刚才创建的xuys用户。host字段表示登录的主机,其值可以用IP,也可用主机名,
将host字段的值改为%就表示在任何客户端机器上能以xuys用户登录到mysql服务器,建议在开发时设为%。
update user set host = '%' where user = 'xuys';
2、 /mysqladmin -uroot -p21century reload
/mysqladmin -uroot -p21century shutdown
3、/mysqld_safe --user-root &
记住:对授权表的任何修改都需要重新reload,即执行第3步。
如果经过以上3个步骤还是无法从客户端连接,请执行以下操作,在mysql数据库的db表中插入一条记录:
use mysql;
insert into db values('19216888234','%','xuys','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
update db set host = '%' where user = 'xuys';
重复执行上面的第2、3步。
0条评论