标签归档:socket

php与java通过socket通信demo

PHP通过socket与java进行通信与基本的sockent编程没什么区别,一个读,一个写,只是方便起见,用java写,PHP读。
demo实现的简单功能是,接受PHP端写入的字符串,然后原样返回给输出端。代码如下:

import java.io.*;
import java.net.*;

public class Server {
public static void main(String[] args) throws IOException{
  System.out.println("Server started !\n");
  ServerSocket server=new ServerSocket(5678);
  while (true){
                Socket client=server.accept();
                System.out.println("client coming!\n");
                PrintWriter printer = new PrintWriter(client.getOutputStream());
                BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
                String  m = reader.readLine();
                System.out.println("get infomation " + m + "\n from " + client.getInetAddress().toString());
                printer.println(m);
                printer.flush();
                printer.close();
                printer.close();
                client.close();
                System.out.println("client leaving!\n");
              }
        }
} 

运行起来,以后该java程序将监听5678端口,当接收到消息以后,将接收的消息原样返回给客户端……
PHP的代码如下:

<?php
	$socket = socket_create ( AF_INET, SOCK_STREAM, SOL_TCP ) or die ( 'could not create socket' );
	$connect = socket_connect ( $socket, '127.0.0.1', 5678 );
	//向服务端发送数据
	socket_write ( $socket, 'Hello' . "\n" );
	//接受服务端返回数据
	$str = socket_read ( $socket, 1024, PHP_NORMAL_READ );
	
	echo $str;
	//关闭
	socket_close($socket);

PHP程序连接本机的5678端口,写入 Hello,然后读取返回的数据……将返回的数据,输出到浏览器……
先运行起java的服务端,然后用浏览器访问PHP页面,将看到从服务器端返回的Hello

android手机变身电脑遥控器—–shutdown your computer

这个想法,早就有了,想给电脑装个遥控器,但是一直没有试过。最近换了android的手机,支持wifi,然后就简单的实现了一个基础功能吧。也就是用手机关掉自己的笔记本。
使用范围:wifi范围内,遥控器装备(android系统,支持网络通信,支持wifi,支持internet),笔记本(安装jdk或者jre吧)

实现分两步,手机端和电脑端。实现思路如下:
笔记本上运行一个socket监听程序,来监听来自外部的连接,如果接受到连接,然后从连接流中读取一行,判断是否是shutdown,如果是,那么执行关机程序。
手机端分为两个部分,一个文本框EditText,一个button,当点击button的时候,读取文本框中的值作为IP,连接到该IP的指定端口,然后写入一行shutdonw。
反应开始,shutdown这一行字符通过局域网的路由器到达电脑端,电脑经过解析判断,然后执行关机程序。

实现的几段基本代码:

监听代码:

ServerSocket server;
try {
   server = new ServerSocket(9995);
   System.out.println("Server Started!");
   while(true){
	Socket client = server.accept();
	InputStream ins = client.getInputStream();
	BufferedReader br = new BufferedReader(new InputStreamReader(ins));
	String tmp = br.readLine();
	System.out.println("Message received!");
	if(tmp.equals("shutDown".toString())) {
	   System.out.println("Hello message!");
	   Main.shutDown();    
	 }
   }} catch (IOException e) {
// TODO Auto-generated catch block
	e.printStackTrace();
}

关机代码:
Main类的shutdown函数:

try {
   Runtime.getRuntime().exec("poweroff -f");
} catch (IOException e) {
// TODO Auto-generated catch block
  e.printStackTrace();
}

注:本段代码的关机命令,只适用于linux系统。关机命令欠妥,容易丢失数据,服务器还是不要这么做了。

andorid连接和发送代码:

try {
   Socket socket = new Socket(m, 9995);
   OutputStream os = socket.getOutputStream();
   PrintStream ps = new PrintStream(os);
   ps.println("shutDown");
   ps.flush();
   ps.close();
  os.close();
  socket.close();
  this.showError("Close successfully!");
} catch (UnknownHostException e) {
  // TODO Auto-generated catch block
  this.showError("当前主机不在线或者已经被你关掉了!");					 
} catch (IOException e) {
  // TODO Auto-generated catch block
  this.showError("当前主机不在线或者已经被你关掉了!");			
}

android需要以下的权限:

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>

设置开机启动java程序,然后ps -aux 可以看到如下两行

root      1809  0.0  0.0   2040   188 ?        S    Feb21   0:00 /bin/sh -e /etc/srcs.shell
root      1812  0.0  0.0 732708   684 ?        Sl   Feb21   0:35 java -jar /home/istrone/shutdown.jar

如何实现的开机启动就留给聪明一点儿的人去探索吧!