java C/S socket 网络通讯模型
2010-06-01 09:50
411 查看
主要技术:网络通讯+多线程
服务器端程序
server.java
ToClient.java
SocketLogic.java
客戶端程序:
Client.java
ToServer.java
ShareFun.java
服务器端程序
server.java
package server; import java.io.*; import java.net.*; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import com.swtdesigner.SWTResourceManager; public class Server extends Thread { private Text text; private Button startButton; private Button stopButton; private ToClient clientConn = null; public void open() { final Display display = Display.getDefault(); final Shell shell = new Shell(); shell.setImage(SWTResourceManager.getImage(Server.class, "/org/eclipse/jface/dialogs/images/message_info.gif")); shell.setSize(287, 279); shell.setText("服務器"); shell.open(); startButton = new Button(shell, SWT.NONE); startButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { startButton.setEnabled(false); stopButton.setEnabled(true); text.setText("服務器已啟動 >>>"); System.out.println("服務器已啟動..."); clientConn = new ToClient(); clientConn.start(); } }); startButton.setText("啟動"); startButton.setBounds(65, 150, 50, 30); stopButton = new Button(shell, SWT.NONE); stopButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { stopButton.setEnabled(false); startButton.setEnabled(true); text.setText("服務器已停止!"); System.out.println("服務器已停止..."); if(clientConn!=null) { try { clientConn.getSocket().close(); clientConn.stop(); } catch (IOException e1) { e1.printStackTrace(); } clientConn = null; } } }); stopButton.setText("停止"); stopButton.setBounds(160, 150, 50, 30); text = new Text(shell, SWT.BORDER); text.setBounds(60, 75, 159, 24); shell.layout(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } public static void main(String[] args) { Server serverMain = new Server(); serverMain.open(); } }
ToClient.java
package server; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class ToClient extends Thread { ServerSocket serverSocket; public ToClient() { try { serverSocket = new ServerSocket(8018,200); } catch (IOException e) { e.printStackTrace(); } } public void run() { try { while(!Thread.interrupted()) // 線程未停止 { if(serverSocket!=null&&(!serverSocket.isClosed())) { Socket clientSocket = serverSocket.accept(); SocketLogic transHandler = new SocketLogic(clientSocket); transHandler.start(); } } } catch (IOException ex) { if (serverSocket != null && (!serverSocket.isClosed())) { try { serverSocket.close(); ex.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } } } public ServerSocket getSocket() { return serverSocket; } }
SocketLogic.java
package server; import java.net.*; import java.io.*; import org.eclipse.swt.program.Program; public class SocketLogic extends Thread { Socket clientSocket = null; private int bufferLength; boolean isConn = true; private byte[] inputBytes; private String clientOrder; private DataInputStream dataInputStream; private DataOutputStream dataOutputStream; public SocketLogic(Socket socket) { this.clientSocket = socket; } public void run() { try { dataInputStream = new DataInputStream(clientSocket.getInputStream()); dataOutputStream = new DataOutputStream(clientSocket.getOutputStream()); bufferLength = 65536; while (isConn) { inputBytes = null; inputBytes = new byte[bufferLength + 12]; dataInputStream.readFully(inputBytes); { clientOrder = new String(inputBytes, 0, 7); System.out.println("client order is : " + clientOrder); if(clientOrder.equals("OPEWORD")) { int filepathLength = Integer.parseInt(new String(inputBytes, 7, 5)); String filepath = new String(inputBytes,12,filepathLength); System.out.println("filePath "+filepath); File file = new File(filepath); long time = System.currentTimeMillis(); if(file.exists()) { Program.launch(filepath); dataOutputStream.write(client.ShareFun.makepackage("OWORDOK", "00001", new byte[1])); } else { dataOutputStream.write(client.ShareFun.makepackage("OWORDER", "00001", new byte[1])); } System.out.println("open file time is:"+(System.currentTimeMillis()-time)); } else if(clientOrder.equals("OPENEXC")) { int filepathLength = Integer.parseInt(new String(inputBytes, 7, 5)); String filepath = new String(inputBytes,12,filepathLength); System.out.println("filePath "+filepath); File file = new File(filepath); long time = System.currentTimeMillis(); if(file.exists()) { Program.launch(filepath); dataOutputStream.write(client.ShareFun.makepackage("OEXCEOK", "00001", new byte[1])); } else { dataOutputStream.write(client.ShareFun.makepackage("OEXCEER", "00001", new byte[1])); } System.out.println("open file time is:"+(System.currentTimeMillis()-time)); } // 客戶端斷開連結 else if (clientOrder.equals("DISCONN"))// 全部結束時關閉流 { System.out.println("DISCONN : "); dataInputStream.close(); dataOutputStream.close(); this.clientSocket.close(); isConn = false; System.out.println("close all : "); } } } } catch (Exception e) { e.printStackTrace(); } } }
客戶端程序:
Client.java
package client; import java.net.SocketException; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import com.sun.corba.se.impl.protocol.giopmsgheaders.Message; import com.swtdesigner.SWTResourceManager; public class Client { private Button openWordButton; private Button openExcleButton; /** * Launch the application * @param args */ public static void main(String[] args) { try { Client window = new Client(); window.open(); } catch (Exception e) { e.printStackTrace(); } } /** * Open the window */ public void open() { final Display display = Display.getDefault(); final Shell shell = new Shell(); shell.setImage(SWTResourceManager.getImage(Client.class, "/com/sun/java/swing/plaf/windows/icons/Inform.gif")); shell.setSize(500, 375); shell.setText("客戶端"); // shell.open(); openWordButton = new Button(shell, SWT.NONE); openWordButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { ToServer serverConn = null; try { serverConn = new ToServer("10.148.53.188",8018); } catch (SocketException e1) { // e1.printStackTrace(); MessageDialog md1 = new MessageDialog(shell,"提示", null, "網絡連接失敗,請確認!", MessageDialog.ERROR,new String[] { "確定" }, 0); md1.open(); return; } serverConn.start(); String filepath = "c://workspace//johnny.txt"; String isok = serverConn.openWordFile(filepath); serverConn.disConnect(); // 斷開連結 if(isok.equals("ok")) { MessageDialog md1 = new MessageDialog(shell,"成功", null, "打開word文件成功!", MessageDialog.OK,new String[] { "確定" }, 0); md1.open(); return; } else if(isok.equals("error")) { MessageDialog md1 = new MessageDialog(shell,"失敗", null, "打開word文件失敗!", MessageDialog.ERROR,new String[] { "確定" }, 0); md1.open(); return; } } }); openWordButton.setText("打開word文件"); openWordButton.setBounds(54, 75, 90, 29); openExcleButton = new Button(shell, SWT.NONE); openExcleButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { ToServer serverConn = null; try { serverConn = new ToServer("10.148.53.188",8018); } catch (SocketException e1) { // e1.printStackTrace(); MessageDialog md1 = new MessageDialog(shell,"提示", null, "網絡連接失敗,請確認!", MessageDialog.ERROR,new String[] { "確定" }, 0); md1.open(); return; } serverConn.start(); String filepath = "c://workspace//scylla.xls"; String isok = serverConn.openExcelFile(filepath); serverConn.disConnect(); // 斷開連結 if(isok.equals("ok")) { MessageDialog md1 = new MessageDialog(shell,"成功", null, "打開excel文件成功!", MessageDialog.OK,new String[] { "確定" }, 0); md1.open(); return; } else if(isok.equals("error")) { MessageDialog md1 = new MessageDialog(shell,"失敗", null, "打開excel文件失敗!", MessageDialog.ERROR,new String[] { "確定" }, 0); md1.open(); return; } } }); openExcleButton.setText("打開excle文件"); openExcleButton.setBounds(54, 131, 90, 29); shell.layout(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } }
ToServer.java
package client; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException; import java.io.IOException; import java.net.ConnectException; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; public class ToServer extends Thread { private String serverIP; private int serverPort; public boolean isDisconnected = false; // 連結是否存在 public Socket clientSocket; // 套接口 private DataInputStream dataInputStream; private DataOutputStream dataOutputStream; private int bufferlength; // 緩衝大小 byte[] inputBytes; private String serverOrder; private String openWordOk = ""; private String openExcelOk = ""; /** * 構造 */ public ToServer(String serverIP, int serverPort) throws SocketException { this.serverIP = serverIP; this.serverPort = serverPort; try { long time = System.currentTimeMillis(); getSocketConn(); System.out.println("getSocketConn time is:"+(System.currentTimeMillis()-time)); } catch (SocketException e) { // e.printStackTrace(); throw e; } } /** * 取服務器的連結 * * @throws SocketException */ private void getSocketConn() throws SocketException { for (int i = 0; i < 10; i++) { if (getSocket()) { return; } } isDisconnected = true; SocketException sockete = new SocketException("網絡連結出錯"); throw sockete; } /** * 連結服務器 * * @return */ private boolean getSocket() { System.out.println("get connect"); try { // Set up connection clientSocket = new Socket(serverIP, serverPort); clientSocket.setKeepAlive(true); System.out.println("Connected with server: " + serverIP+ " Port is: " + serverPort); dataInputStream = new DataInputStream(clientSocket.getInputStream()); dataOutputStream = new DataOutputStream(clientSocket.getOutputStream()); } catch (ConnectException e) { return false; } catch (UnknownHostException e) { e.printStackTrace(); return false; } catch (IOException e) { e.printStackTrace(); return false; } return true; } /** * 啟動線程 Fuction run() of thread */ public void run() { // mylog.info("Client get socket input&output stream!"); bufferlength = 65536; // Init data package inputBytes = new byte[bufferlength + 12]; // Listen to socket, do with the order from server doBusiness(); } /** * 與服務器的通信函數 */ private void doBusiness() { try { while (!isDisconnected) { if (dataInputStream != null) { try { dataInputStream.readFully(inputBytes); } catch (EOFException e) { e.printStackTrace(); } } else { return; } // Get server order serverOrder = new String(inputBytes, 0, 7); System.out.println("serverOrder = " + serverOrder); if (serverOrder.equals("OWORDOK")) { this.openWordOk = "ok"; } else if(serverOrder.equals("OWORDER")) { this.openWordOk = "error"; } else if(serverOrder.equals("OEXCEOK")) { this.openExcelOk = "ok"; } else if(serverOrder.equals("OEXCEER")) { this.openExcelOk = "error"; } } } catch (SocketException se) { System.out.println(" close the socket !"); } catch (IOException e) { e.printStackTrace(); } } /** * 打開word文件 */ public String openWordFile(String filepath) { try { String filepathlength = ShareFun.formatLength(filepath.getBytes().length);; byte[] outBytes = ShareFun.makepackage("OPEWORD", filepathlength,filepath.getBytes()); dataOutputStream.write(outBytes, 0, outBytes.length); System.out.println(" to server openwordfile "); } catch (IOException e) { e.printStackTrace(); } boolean overTime = true; long time = System.currentTimeMillis(); while (overTime) { try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } if (this.openWordOk.equalsIgnoreCase("ok")) { return "ok"; } if (this.openWordOk.equalsIgnoreCase("error")) { return "error"; } if ((System.currentTimeMillis() - time) > 60000 * 5)// 超時時間5分鐘 { overTime = false; } } return "error"; } /** * 打開excel文件 */ public String openExcelFile(String filepath) { try { String filepathlength = ShareFun.formatLength(filepath.getBytes().length);; byte[] outBytes = ShareFun.makepackage("OPENEXC", filepathlength,filepath.getBytes()); dataOutputStream.write(outBytes, 0, outBytes.length); System.out.println(" to server openExcelFile "); } catch (IOException e) { e.printStackTrace(); } boolean overTime = true; long time = System.currentTimeMillis(); while (overTime) { try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } if (this.openExcelOk.equalsIgnoreCase("ok")) { return "ok"; } if (this.openExcelOk.equalsIgnoreCase("error")) { return "error"; } if ((System.currentTimeMillis() - time) > 60000 * 5)// 超時時間5分鐘 { overTime = false; } } return "error"; } /** * client disconnect from server 關閉連接 */ public boolean disConnect() { try { System.out.println(" 斷開連結"); byte[] outBytes = ShareFun.makepackage("DISCONN", "00001", new byte[1]); dataOutputStream.write(outBytes, 0, outBytes.length); dataInputStream.close(); dataOutputStream.close(); this.clientSocket.close(); isDisconnected = true; } catch (IOException e) { e.printStackTrace(); return false; } return true; } }
ShareFun.java
package client; /** * Public fuction, use to make package and format length * * @version * @author */ public class ShareFun { /** * 打包 * @param strOrder 命令字符 * @param strLength 傳送的文件的長度 * @param data 【】 傳送的數據 * @return */ public static byte[] makepackage(String strOrder, String strLength, byte[] data) { int orderLength = strOrder.length(); int length = strLength.length(); byte[] bytesOrder = strOrder.getBytes(); byte[] bytesLength = strLength.getBytes(); byte[] returnBytes = new byte[65548]; for (int i = 0; i < orderLength; i++) { returnBytes[i] = bytesOrder[i]; } for (int i = orderLength; i < length + orderLength; i++) { returnBytes[i] = bytesLength[i - orderLength]; } for (int i = length + orderLength; i < data.length + length + orderLength; i++) { returnBytes[i] = data[i - length - orderLength]; } return returnBytes; } /** * 格式化長度值(轉換成String) * @param int length 數字式長度 * @return String */ public static String formatLength(int length) { int i = 0, j = 0, k = 0, l = 0, m = 0; String strdata = new String(""); m = length % 10; l = (length % 100) / 10; k = (length % 1000) / 100; j = (length % 10000) / 1000; i = length / 10000; strdata += String.valueOf(i) + String.valueOf(j) + String.valueOf(k) + String.valueOf(l) + String.valueOf(m); return strdata; } }
相关文章推荐
- OSI七层网络模型与TCP/IP四层网络模型及在java中对应API(Socket、HttpServlet)实现
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
- OSI七层网络模型与TCP/IP四层网络模型及在java中对应API(Socket、HttpServlet)实现
- Linux网络服务器epoll模型的socket通讯的实现(一)
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
- Socket网络通讯开发总结之:Java 与 C进行Socket通讯【转】from http://www.linuxidc.com/Linux/2012-06/63173.htm
- Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯
- Socket网络通讯开发总结之:Java 与 C进行Socket通讯
- Java ServerSocket Socket 网络通讯的那些事
- JAVA与网络开发(TCP:Socket、ServerSocket;UDP:DatagramSocket、DatagramPacket;多线程的C/S通讯、RMI开发概述)
- Socket网络通讯开发总结之:Java 与 C进行Socket通讯
- Socket网络通讯开发总结之:Java 与 C进行Socket通讯
- JAVA与网络开发(TCP:Socket、ServerSocket;UDP:DatagramSocket、DatagramPacket;多线程的C/S通讯、RMI开发概述)
- java网络通讯socket的课题
- Socket网络通讯开发总结之:Java 与 C进行Socket通讯(转)
- 浅谈JAVA中如何利用socket进行网络编程(一)
- java的nio之:java的bio流下实现的socket服务器同步阻塞模型和socket的伪异步的socket服务器的通信模型
- NetworkSocket C# 网络通讯 组件
- 【黑马程序员】Java基础12:UDP和TCP的网络通讯
- java网络socket编程(一)之基础简介