gpt4 book ai didi

java - 如何用Java创建一个不断监听服务器的套接字?

转载 作者:太空宇宙 更新时间:2023-11-04 06:19:26 26 4
gpt4 key购买 nike

我正在使用 Java 的套接字做一种时钟,但是我需要我的客户端可以与服务器交互来更改时间。我的主要问题是:如果我添加任何代码来监听客户端,服务器就会停止。我认为我可以使用线程或异步函数,但我对 Java 完全陌生,我不知道如何操作它。

这些是我当前的代码:

服务器.java

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class server {

public static void main(String[] args) throws IOException,
ClassNotFoundException {

ServerSocket ss = new ServerSocket(2000);
Timer data = new Timer();

while (true) {

Socket s = ss.accept();

ArrayList<Integer> time = new ArrayList<Integer>();

data.updateTime();

time.add(data.getHour());
time.add(data.getMinute());
time.add(data.getSecond());

System.out.println(time.get(0) + ":" + time.get(1) + ":"
+ time.get(2));

try {
ObjectOutputStream oos = new ObjectOutputStream(
s.getOutputStream());
oos.writeObject(time);
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(1000); // 1000 milliseconds is one second.
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
}

定时器.java

import java.util.Random;

public class Timer {
private int hour;
private int minute;
private int second;

public Timer() {
this.hour = randInt(0, 23);
this.minute = randInt(0, 59);
this.second = randInt(0, 59);
}

public void changeTime(int hour, int minute, int second) {
this.hour = hour;
this.minute = minute;
this.second = second;
}

public static int randInt(int min, int max) {

// NOTE: Usually this should be a field rather than a method
// variable so that it is not re-seeded every call.
Random rand = new Random();

// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
int randomNum = rand.nextInt((max - min) + 1) + min;

return randomNum;
}

private void updateHour() {
if (this.hour == 23)
this.hour = 0;
else
this.hour++;
}

private void updateMinute() {
if (this.minute == 59)
this.minute = 0;
else
this.minute++;
}

private void updateSecond() {
if (this.second == 59)
this.second = 0;
else
this.second++;
}

public int getHour() {
return hour;
}

public int getMinute() {
return minute;
}

public int getSecond() {
return second;
}

public void updateTime() {
this.updateSecond();

if (this.second == 0) {
this.updateMinute();
if (this.minute == 0)
this.updateHour();
}
}
}

这是我尝试发送数据的事件点击:

    public void actionPerformed(ActionEvent arg0) {
if (arg0.getSource() == startButton) {
Socket s;
try {
s = new Socket("localhost", 2000);
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(
in, textField1.getText()));
out = new BufferedOutputStream(out);
PrintWriter pw = new PrintWriter(new OutputStreamWriter(out,
textField1.getText()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// we try to connect
}
}

我想知道你们中是否有人知道我应该在服务器中添加什么样的代码来继续发送随机创建的时间,并等待是否有来自客户端的消息以及是否有消息需要使用新消息更改时间。提前感谢您的帮助,如果这是一个基本问题,我很抱歉,但我对 Sockets 和 Java 非常陌生。

最佳答案

您可以创建一个类来存储计时器。

public class MyTimer(){
private Timer t;
public MyTimer(Timer t){
this.t = t;
}

public synchronized Timer getTimer(){
return t;
}

public synchronized void setTimer(Timer t){
this.t = t;
}
}

在服务器中,您需要使用此类中的对象。

final MyTimer myTimer = new MyTimer(new Timer());

在 while 循环的第一行中,您可以将 myTimer 内的计时器获取到您的数据变量。

Timer data = myTimer.getTimer();

在while循环之前,启动一个新的Thread来监听客户端,以便可以更新myTimer对象中的计时器。

new Thread(new Runnable(){
public void run(){
while(true){
//Listen to the client if there is new time available
//get new timer to a variable (here, newData)
myTimer.setTimer(newData);
}
}
}).start();

关于java - 如何用Java创建一个不断监听服务器的套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27612706/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com