我有以下两个功能
public void mousePressed(MouseEvent e) {
x=e.getX();
y=e.getY();
PrintStream ps;
try {
ps = new PrintStream(sc.getOutputStream());
ps.println("!!##print"+" "+x+" "+" "+y+" "+x+" "+y);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
public void mouseDragged(MouseEvent e) {
x1=e.getX();
y1=e.getY();
gr=canvas.getGraphics();
gr.drawLine(x, y, x1, y1);
if(x!=x1||y!=y1)
{
try {
PrintStream ps=new PrintStream(sc.getOutputStream());
ps.println("!!##print"+" "+x+" "+" "+y+" "+x1+" "+y1);
} catch (IOException e1) {
e1.printStackTrace();
}
}
x=x1;
y=y1;
}
问题是当我使用打印流发送点时,它会进入“服务器处理程序”,我在控制台中打印它们。我发现当我用鼠标快速移动时,它无法获取所有点和点当我在其他用户 Canvas 上打印它们时,其中会有空格。如何获得鼠标所经过的所有点而不丢失它们?这些功能有什么不擅长的?(sc是服务器的socket) 这是在服务器中处理绘制命令的部分(sock 是套接字的数组列表,sc 是当前套接字)
Iterator<Socket> it=sock.iterator();
while(it.hasNext())
{
Socket vv=it.next();
if(vv!=sc)
{
ps=new PrintStream (vv.getOutputStream());
ps.println(ms);
}
}
这里是分析消息的部分,以查看传输了哪些点并绘制它们。这里一切都出错了,因为它没有获取服务器传输的所有消息。为什么会发生这种情况以及我该如何做解决了吗?
else if(mes.charAt(0)=='!'&&mes.charAt(1)=='!'&&mes.charAt(2)=='#'&&mes.charAt(3)=='#'&&
mes.charAt(4)=='p'&&mes.charAt(5)=='r'&&mes.charAt(6)=='i'&&mes.charAt(7)=='n'&&
mes.charAt(8)=='t'
)
{
StringTokenizer tok=new StringTokenizer(mes);
String aii=tok.nextToken();
ArrayList<Integer> numere=new ArrayList<Integer>();
for(int i=0;i<4;i++)
{
numere.add(Integer.parseInt(tok.nextToken()));
}
Graphics gs=canvas.getGraphics();
gs.drawLine(numere.get(0), numere.get(1), numere.get(2), numere.get(3));
}
最佳答案
我认为您的问题可能与您的 PrintStream
资源有关。每次绘制新像素时,您都会打开一个新像素,并且速度可能会很快,以至于前一个像素没有时间关闭,因此它只会抛出 IOException。我建议在您的 main
函数或服务器连接 (sc
) 的某个地方也声明一个全局 PrintStream
,这样您就不会不必一直打开和关闭一个。示例:
Socket sc;
PrintStream ps;
public static void main(String a[]){
sc = new Socket("example.com");
PrintStream ps = new PrintStream(sc.getOutputStream());
}
完成后,只需访问全局PrintStream
即可将数据发送到您的服务器。希望这有帮助!
关于Java Canvas 绘图套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38854878/