java 点餐界面_Java小项目点餐系统(二)之服务端 | 学步园
服務端詳解:
服務端的主要功能就是無限監聽一個端口號,對客戶端發來的連接請求給予回應,然后開辟新線程處理客戶端。界面做的比較簡單就是顯示在線的用戶,分為商家和學生。
一.監聽客戶端的socket連接請求
package mainjframe;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class MainWindow extends JFrame{
ServerSocket server;
JTable user_table;
JTable seller_table;
JScrollPane user_jscrollPane;
JScrollPane seller_jscrollPane;
DefaultTableModel user_model;
DefaultTableModel seller_model;
String []user_headers = {"序號","在線學生"};
String []seller_headers = {"序號","在線商家"};
Object [][]cellData=null;
LinkedList student,seller;
LinkedList mysocket;
public static void main(String args[])
{
new MainWindow("服務端");
}
public MainWindow(String s)
{
super(s);
student = new LinkedList();
seller = new LinkedList();
mysocket = new LinkedList();
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
dispose();
System.exit(0);
}
}
);
//獲取屏幕大小
Dimension screenSize =Toolkit.getDefaultToolkit().getScreenSize();
//設置窗體的位置和大小
setBounds((screenSize.width-320)/2,(screenSize.height-240)/2,320,240);
setLayout(new GridLayout());
user_model = new DefaultTableModel(cellData,user_headers);
user_table = new JTable(user_model);
seller_model = new DefaultTableModel(cellData,seller_headers);
seller_table = new JTable(seller_model);
user_jscrollPane = new JScrollPane(user_table);
user_jscrollPane.setPreferredSize(new Dimension(160, 240));
seller_jscrollPane = new JScrollPane(seller_table);
seller_jscrollPane.setPreferredSize(new Dimension(160, 240));
add(user_jscrollPane);
add(seller_jscrollPane);
setVisible(true);
validate();
startServer();
}
void update()
{
user_model.setRowCount(0);
seller_model.setRowCount(0);
for(int i=0;i
{
user_model.addRow(new Object[]{i+1,student.get(i).account});
}
for(int i=0;i
{
seller_model.addRow(new Object[]{i+1,seller.get(i).account});
}
}
void startServer() {
int i = 0;
try {
//設置監聽端口號和最大接入數
server = new ServerSocket(8889, 3);
System.out.println("==========start===========快點來啊");
new Thread(new ListenThread(this)).start();
while (true) {
Socket socket = server.accept();
mysocket.add(socket);
i++;
System.out.println("第" + i + "個用戶連接成功!");
System.out.println("該用戶端的地址信息為:"+socket.getInetAddress());
new Thread(new ServerThread(socket,this)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ListenThread implements Runnable
{
private MainWindow mainWindow;
public ListenThread(MainWindow mainWindow)
{
this.mainWindow = mainWindow;
}
public void run()
{
while(true)
{
for(int i=0;i
{
if(mainWindow.mysocket.get(i).isClosed())
{
for(int j=0;j
{
if(mainWindow.student.get(i).address == mainWindow.mysocket.get(i).getInetAddress())
mainWindow.student.remove(mainWindow.student.get(i));
}
for(int j=0;j
{
if(mainWindow.seller.get(i).address == mainWindow.mysocket.get(i).getInetAddress())
mainWindow.seller.remove(mainWindow.seller.get(i));
}
mainWindow.update();
mainWindow.mysocket.remove(mainWindow.mysocket.get(i));
System.out.println("客戶端已經斷開");
}
}
try
{
Thread.sleep(500);
}
catch(Exception e)
{}
}}
}
在進程中使用while循環不斷監聽客戶端發過來的請求,一旦請求建立成功就新建一個ServerThread子線程來處理客戶端的請求,而主線程繼續等待。同時開辟一個ListenThread線程不斷判斷哪一個線程已經斷開連接。
二.在ServerThread中對客戶端的請求進行處理
package mainjframe;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
public class ServerThread implements Runnable {
private Socket socket;
private String accept;
String account,passwd;
DataInputStream in = null;
DataOutputStream out = null;
LinkMySql linkMySql;
String dept;
private MainWindow mainWindow;
// 創建靜態全局變量
public ServerThread(Socket socket,MainWindow mainWindow)
{
this.mainWindow = mainWindow;
this.socket = socket;
linkMySql = new LinkMySql(this);
}
// 任務是為一個用戶提供服務
@Override
public void run()
{
try
{
// 讀取客戶端傳過來信息的DataInputStream
in = new DataInputStream(socket.getInputStream());
// 向客戶端發送信息的DataOutputStream
out = new DataOutputStream(socket.getOutputStream());
System.out.println("放馬過來吧!!!!");
// 讀取來自客戶端的信息
accept = in.readUTF();
System.out.println(accept);
}
catch (IOException e)
{
e.printStackTrace();
}
if(accept.equals("LOGIN"))
{
try
{
account = in.readUTF();
passwd = in.readUTF();
System.out.println("用戶名:"+account+"\n密碼:"+passwd);
for(int i=0;i
{
if(account.equals(mainWindow.student.get(i).account))
{
socket.close();
}
}
for(int i=0;i
{
if(account.equals(mainWindow.seller.get(i).account))
{
socket.close();
}
}
dept = linkMySql.query(account,passwd);
out.writeUTF(dept);
if(dept.equals("student"))
{
User temp = new User();
temp.account = account;
temp.passwd = passwd;
temp.type = "student";
temp.address = socket.getInetAddress();
mainWindow.student.add(temp);
mainWindow.update();
linkMySql.initStudent(in,out);
linkMySql.handleOrder();
}
else if(dept.equals("seller"))
{
User temp = new User();
temp.account = account;
temp.passwd = passwd;
temp.type = "seller";
temp.address = socket.getInetAddress();
mainWindow.seller.add(temp);
mainWindow.update();
linkMySql.initseller(in,out);
}
}
catch(IOException e)
{
}
}
else if(accept.equals("REGISTER"))
{
}
}
}
先讀取客戶端發來的請求,然后進入對應的功能模塊,如果是用戶登錄,則進行sql語句操作并對結果做出反應,如果查詢錯誤則關閉該線程,判斷為學生則加入學生鏈表并初始化學生端的商品信息和店鋪信息,判斷為商家則把改商家的商品信息發過去并查找相應的訂單表,把屬于該商家的訂單發給商家。
服務端的主要功能就是利用socket和多線程把學生端和商家端連接起來,并把所有對數據的操作集中在服務端來做,全部由服務端與數據庫進行交互,保證數據的安全。
總結
以上是生活随笔為你收集整理的java 点餐界面_Java小项目点餐系统(二)之服务端 | 学步园的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux内核中的常用宏containe
- 下一篇: 高并发系统之降级特技