㈠ Socket简单的数据包的发送与接收
具体的发包与拆包的协议可以自己定义:
我定义:包头第一个字节为1时则为接收文件为0则为接收字符
服务器:
private static void writefile(DataOutputStream dos, FileInputStream fis) {
byte[] bytes=new byte[2];//先发包头
int length;
bytes[0]=1;
bytes[1]=5;
try {
dos.write(bytes);//发给客户端
} catch (IOException e) {
e.printStackTrace();
System.out.println("发送包头失败");
}
try{
byte[] bytes1=new byte[1024];//发送包体数据
while((length=fis.read(bytes1, 0,bytes1.length))!=-1){
dos.write(bytes1,0,bytes1.length);
dos.flush();
}
}catch(Exception e){
e.printStackTrace();
System.out.println("发送文件包体数据失败");
}
}
private static void writestring(DataOutputStream dos) {
// TODO Auto-generated method stub
String string="sending";
byte[] bytes=new byte[2];//同理发送字符串的包头
bytes[0]=0;
bytes[1]=5;
try {
dos.write(bytes);
} catch (IOException e) {
e.printStackTrace();
System.out.println("发送包头失败");
}
try {
byte[] bytes1=new byte[1024];//发送字符串的包体数据
bytes1=string.getBytes();
dos.write(bytes1);
} catch (IOException e1) {
e1.printStackTrace();
System.out.println("发送字符包体数据失败");
}
}
}
客户端:
try{
s=new Socket("192.168.1.106",45);
Log.d(TAG, "run:2222222222222");
is=s.getInputStream();
dis=new DataInputStream(is);
new Thread(){
@Override
public void run(){
super.run();
try{
dis = new DataInputStream(s.getInputStream());
Log.d(TAG, "33333333333333");
byte[] bytes=new byte[2];
dis.read(bytes);
if(bytes[0]==0){
int a=bytes[1];
byte[] bytes1=new byte[a];
dis.readFully(bytes1);
String ssss=new String(bytes1);
Message msg=new Message();
msg.what=2;
msg.obj=ssss;
revhandler.sendMessage(msg);
}
else {
{
File file=new File("/storage/emulated/0/1/c.jpg");
Log.d(TAG,"run:2.55555555555555555555555");
fos=new FileOutputStream(file);
Log.d(TAG,"run:333333333333333333333");
inputByte = new byte[30];//接收数据
Message msg=new Message();
msg.what=0;
revhandler.sendMessage(msg);
Log.d(TAG,"run:44444444444444");
while((length = dis.read(inputByte, 0, inputByte.length)) != -1) {
Log.d(TAG,"44444444");
fos.write(inputByte,0,inputByte.length);
fos.flush();
}
msg = new Message();
msg.what=1;
revhandler.sendMessage(msg);
if(fos != null)
fos.close();
if(dis != null)
dis.close();
s.close();
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
运行结果:
服务器:
![V1LEZDB Z07VQ482$02HO%R.png
客户端:
㈡ php的socket编程
socket_bind($socket,'127.0.0.1',9000);
服务器端绑定IP指的是127.0.0.1,就是服务器本机,监听9000端口
㈢ 问一下,PHP中的Socket怎么被动接收数据
首先是服务端的代码:
<?php
$host = 'localhost';
$port = 4888;
set_time_limit(0);
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
$result = socket_bind($socket, $host, $port) or die("Could not blind to port\n");
$result = socket_listen($socket, 3) or die("Could not set LIstener\n");
while($spawn = socket_accept($socket) or die("Could not readinput\n")){
$input = socket_read($spawn, 1024);
echo $input,"\n";
$input = '7636553:'.trim($input);
//client
$output = $input."\n";
socket_write($spawn, $output, strlen($output));
}
//kill
socket_close($spawn);
socket_close($socket);
echo "close\n";
?>
客户端的代码:
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$connection = socket_connect($socket, 'localhost',4888) or die("Could not connect\n");
echo 'Write to Socket',"\n";
if(!socket_write($socket, "some data")){
echo 'write failed',"\n";
}
//read respose from socket
while($buffer = socket_read($socket, 1024)){
echo 'Response: ',$buffer,"\n";
}
?>
先启动服务器端,再执行客户端。然后,你就可以看见这个效果了。
㈣ php socket udp 通信
与设备发送数据的程序编写人协调,在发送的数据前面添加一个标识设备ID的内容,这样接收数据后从数据判断设备号,而不是通过IP和PORT。
例如约定用两位数表示设备ID,那么设备01发送的数据是AAAAA修改为发送01AAAAA,收到数据后识别01为设备号,后面的AAAAA作为数据。
㈤ socket怎样做到实时接收信息
1. 根据ERRNO和recv结果进行判断在UNIX/LINUX下,非阻塞模式SOCKET可以采用recv+MSG_PEEK的方式进行判断,其中MSG_PEEK保证了仅仅进行状态判断,而不影响数据接收对于主动关闭的SOCKET, recv返回-1,而且errno被置为9(#define EBADF 9 /* Bad file number */)或104 (#define ECONNRESET 104 /* Connection reset by peer */)对于被动关闭的SOCKET,recv返回0,而且errno被置为11(#define EWOULDBLOCK EAGAIN /* Operation would block */) 对正常的SOCKET, 如果有接收数据,则返回>0, 否则返回-1,而且errno被置为11(#define EWOULDBLOCK EAGAIN /* Operation would block */) 因此对于简单的状态判断(不过多考虑异常情况): recv返回>0, 正常 返回-1,而且errno被置为11 正常 其它情况 关闭
㈥ 想问下php的socket的工作流程是什么
PHP 使用Berkley的socket库来创建它的连接。你可以知道socket只不过是一个数据结构。你使用这个socket数据结构去开始一个客户端和服务器之间的会话。这个服务器是一直在监听准备产生一个新的会话。当一个客户端连接服务器,它就打开服务器正在进行监听的一个端口进行会话。这时,服务器端接受客户端的连接请求,那么就进行一次循环。现在这个客户端就能够发送信息到服务器,服务器也能发送信息给客户端。
产生一个Socket,你需要三个变量:一个协议、一个socket类型和一个公共协议类型。产生一个socket有三种协议供选择,继续看下面的内容来获取详细的协议内容。
定义一个公共的协议类型是进行连接一个必不可少的元素。下面的表我们看看有那些公共的协议类型。
表一:协议
名字/常量 描述
AF_INET 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用在IPv4的地址
AF_INET6 与上面类似,不过是来用在IPv6的地址
AF_UNIX 本地协议,使用在Unix和Linux系统上,它很少使用,一般都是当客户端和服务器在同一台及其上的时候使用
表二:Socket类型
名字/常量 描述
SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,这个socket是使用TCP来进行传输。
SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用UDP来进行它的连接。
SOCK_SEQPACKET 这个协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。
SOCK_RAW 这个socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、traceroute使用该协议)
SOCK_RDM 这个类型是很少使用的,在大部分的操作系统上没有实现,它是提供给数据链路层使用,不保证数据包的顺序
表三:公共协议
名字/常量 描述
ICMP 互联网控制消息协议,主要使用在网关和主机上,用来检查网络状况和报告错误信息
UDP 用户数据报文协议,它是一个无连接,不可靠的传输协议
TCP 传输控制协议,这是一个使用最多的可靠的公共协议,它能保证数据包能够到达接受者那儿,如果在传输过程中发生错误,那么它将重新发送出错数据包。
现在你知道了产生一个socket的三个元素,那么我们就在php中使用socket_create()函数来产生一个socket。这个 socket_create()函数需要三个参数:一个协议、一个socket类型、一个公共协议。socket_create()函数运行成功返回一个包含socket的资源类型,如果没有成功则返回false。
Resourece socket_create(int protocol, int socketType, int commonProtocol);
现在你产生一个socket,然后呢?php提供了几个操纵socket的函数。你能够绑定socket到一个IP,监听一个socket的通信,接受一个socket;现在我们来看一个例子,了解函数是如何产生、接受和监听一个socket。
<?php
$commonProtocol = getprotobyname(“tcp”);
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, ‘localhost’, 1337);
socket_listen($socket);
// More socket functionality to come
?>
上面这个例子产生一个你自己的服务器端。例子第一行,
$commonProtocol = getprotobyname(“tcp”);
使用公共协议名字来获取一个协议类型。在这里使用的是TCP公共协议,如果你想使用UDP或者ICMP协议,那么你应该把getprotobyname() 函数的参数改为“udp”或“icmp”。还有一个可选的办法是不使用getprotobyname()函数而是指定SOL_TCP或SOL_UDP在 socket_create()函数中。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
例子的第二行是产生一个socket并且返回一个socket资源的实例。在你有了一个socket资源的实例以后,你就必须把socket绑定到一个IP地址和某一个端口上。
㈦ socket发送大量数据时如何接收
只要是接收端 你都应该不停的等待消息 ,接受消息的那一段可以这样写 while(true) { try{ Thread.sleep(300);}catch(Excepion e){} //注意这里的inStream是DataInputStream 当然你也可以加以装饰 String message= inStream.readUTF(); if(message!=null) { System.out.println("收到消息:"+message); } } 只有这样才能不断从发送端收到消息,这段代码只是给你一个提示,有问题给我留言,通常为了程序的合理性 最好把这段代码写进一个线程里面,这样更合理
㈧ 本质就是websocket的客户端,php Websocket 怎么接收数据
流程:
监听端口
接受连接
进行websocket握手
握手成功后的连接进行数据处理
返回响应数据 class WebsocketClient { private $_Socket = null; public function __construct($host, $port) { $this->_connect($host, $port); } public function __destruct() { $this->_disconnect(); } public function sendData($data) {我推荐你去后盾人上面看看里面有很多关于这类php之类的教学视频哦⊙∀⊙!,视频讲解高质量
㈨ socket 发送之后 如何接收 服务端发来的信息
客户端不需要向服务器端在某个端口监听,你需要做的事自定义一个read消息函数。但服务器有消息传过来,就会异步地调用这个函数进行接受,在这个函数里,定义一个字节数组用来接收读到的数据,方法用socket的函数。看你是什么语言。c++与java都不同。