您的位置:首页 > 理论基础 > 计算机网络

java C/S socket 网络通讯模型

2010-06-01 09:50 411 查看
主要技术:网络通讯+多线程

服务器端程序

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐