这两个月要做一个Android远程控制PC的一个project,昨天才分析出思路,先做基本的,socket连接,到图书馆找socket编程的书,结果《Thinking in java》里面没见socket,不知道是我英文不好还是怎样,但当时就剩下一本英文版的。只能另外找了一本,我看讲得确实很不错。就照着写了一遍
1,建立服务器端,分为5步:
第一步:创建ServerSocket对象
ServerSocket server = new ServerSocket(port,queueLength);
第二步:通过ServerSocket将服务器与端口绑定,监听客户机进行的连接
Socket connection = server.accept();
这条语句返回一个Socket对象
第三步:获得OutputStream和InputStream对象
ObjectInputStream input = new ObjectInptStream(connection.getInputStream()); ObjectOutputStream output = new ObjectOutputStream(connection.getOutputStream());
第四步:服务器和客户端通过InputStream和OutputStream对象通信
第五步:关闭连接
Server代码
package com.zph.control; import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; /** * 2011-10-23 14:57 * * */ public class Server extends JFrame{ /** * */ private static final long serialVersionUID = -3956199261211237769L; private JTextField enterField; private JTextArea displayArea; private ObjectOutputStream output; private ObjectInputStream input; private ServerSocket server; private Socket connection; private int counter = 1; private int port = 5000; public int getPort() { return this.port; } public void setPort(int port) { this.port = port; } public Server() { super("server"); Container container = this.getContentPane(); enterField = new JTextField(); enterField.setEnabled(false); this.enterField.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { sendData(e.getActionCommand()); enterField.setText(""); } //end inner class }); container.add(enterField, BorderLayout.NORTH); displayArea = new JTextArea(); container.add(new JScrollPane(displayArea), BorderLayout.CENTER); setSize(300,500); setVisible(true); } protected void sendData(String message) { try { this.output.writeObject("SERVER >>> "+ message); this.output.flush(); displayArea.append("\nSERVER>>>"+message); } catch (IOException e) { displayArea.append("\n ERROR>>>"+message); } } public void runServer(){ try { //step 1 server = new ServerSocket(port,10); } catch (IOException e) { displayArea.append("\nServer IO Exception "+e.toString()); } while(true){ //step 2 waitForConnection(); //step 3 getStream(); //step 4 processConnection(); //step 5 closeConnection(); ++counter; } } private void waitForConnection() { displayArea.setText("wait for connection\n"); try { connection = server.accept(); displayArea.append("connection"+counter +"recevied from:" +connection.getInetAddress().getHostName()); } catch (IOException e) { displayArea.append("\n"+e.toString()); } } private void getStream() { try { output = new ObjectOutputStream(connection.getOutputStream()); output.flush(); input =new ObjectInputStream( connection.getInputStream()); displayArea.append("\nGot I/O streams\n"); } catch (IOException e) { displayArea.append("\n"+e.toString()); } } private void processConnection() { String message = "SERVER>>> Connection successful"; try { output.writeObject(message); output.flush(); } catch (IOException e) { displayArea.append("\n"+e.toString()); } enterField.setEnabled(true); do{ try { message = (String) input.readObject(); displayArea.append("\n"+message); displayArea.setCaretPosition(displayArea.getText().length()); } catch (IOException e) { displayArea.append("\nIOException"+e.toString()); } catch (ClassNotFoundException e) { displayArea.append("\nClassNotFound Exception"); } }while(!message.trim().equalsIgnoreCase("CLIENT>>>TERMINATE")); } private void closeConnection() { displayArea.append("\nUser terminated connection"); enterField.setEnabled(false); try { output.close(); input.close(); connection.close(); } catch (IOException e) { displayArea.append("\n"+e.toString()); } } public static void main(String[] args) { Server PCServer = new Server(); PCServer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); PCServer.runServer(); } }
2,建立客户端,分为四步:
第一步:创建一个Socket对象用来连接到服务器上
Socket connection = new Socket(serverAddress , port);
第二步:用Socket的getInputStream方法和getOutputStream方法分别用于获得与Socket 相关联的InputStream和OutputStream的引用,
第三步:客户端与服务端通过InputStream和OutputStream 对象通信的处理
第四步:关闭连接
Client代码:
package com.zph.control; import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; /** * 2011-10-23 15:53 * * */ public class Client extends JFrame { /** * */ private static final long serialVersionUID = 3221172809627731102L; private JTextField enterField; private JTextArea displayArea; private ObjectOutputStream output; private ObjectInputStream input; private String message = ""; private String chatServer; private Socket client; private int port = 5000; public int getPort() { return port; } public void setPort(int port) { this.port = port; } public Client(String host) { super("client"); chatServer = host; Container container = this.getContentPane(); enterField = new JTextField(); enterField.setVisible(true); enterField.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { sendData(e.getActionCommand()); enterField.setText(""); } // end inner class });// end addActionListener container.add(enterField, BorderLayout.NORTH); displayArea = new JTextArea(); container.add(new JScrollPane(displayArea), BorderLayout.CENTER); this.setSize(300, 500); this.setVisible(true); } protected void sendData(String message) { try { output.writeObject("CLIENT>>>" + message); output.flush(); displayArea.append("\nCLIENT>>>" + message); } catch (IOException e) { displayArea.append("\nERROR wirte Object"); } } public void runClient() { // step 1 ,create a socket to make connection connectToServer(); //step 2 , get inputStream and outputStream getStreams(); // step 3 ,process connection proccessConnection(); // step 4 ,close connections closeConnection(); } private void connectToServer() { try { displayArea.setText("Attempting connection\n"); client = new Socket(InetAddress.getByName(chatServer), port); displayArea.append("connection to " + client.getInetAddress().getHostName()); } catch (UnknownHostException e) { displayArea.append("\nERROR unKnownHost"); } catch (IOException e) { displayArea.append("\n" + e.toString()); } } private void getStreams() { try { output = new ObjectOutputStream(client.getOutputStream()); output.flush(); input = new ObjectInputStream(client.getInputStream()); } catch (IOException e) { displayArea.append("\n"+e.toString()); } } private void proccessConnection() { enterField.setEnabled(true); do{ try { message = (String) input.readObject(); displayArea.append("\n"+message); displayArea.setCaretPosition( displayArea.getText().length()); } catch (IOException e) { displayArea.append("\n"+e.toString()); } catch (ClassNotFoundException e) { displayArea.append("\n class not found"); } }while(!message.trim().equalsIgnoreCase("SERVER>>>TERMINATE")); } private void closeConnection() { displayArea.append("\nClosing connection"); try { output.close(); input.close(); client.close(); } catch (IOException e) { displayArea.append("\n"+e.toString()); } } public static void main(String[] args) { Client PCClient = new Client("127.0.0.1"); PCClient.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); PCClient.runClient(); } }
回到需求,android作为控制端,PC作为受控端,连接的时候(我个人觉得)如果是在局域网,只要设置一下IP和端口,一样可以用这个办法连,如果是连上了Internet,我真不知道会不会成功,感觉设置好了IP和端口也行。
昨天下载了一个网灵一号,做的真好,画面居然还能那么清晰。
android部分的代码本来我要写出来了,可是5点钟的时候让我真的受不了了,我又要发一下牢骚,这世道这么会有这么多邪恶的人,大白天的对人家女生那么无理,人家是去学车的,你作为教练也算是老师,有句话怎么说的:……
女生学车千万别一个人去!