我有以下两个功能
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;
}
问题是当我使用printstream发送点进入“服务器处理程序”时我在控制台中打印它们。我看到当我用鼠标快速移动时它无法获得所有点和点数当我在其他用户画布上打印时,它们中会有空格。我怎样才能获得鼠标移动的所有点而不会丢失它们?什么不擅长这些功能?(sc是服务器的套接字) 这是在服务器中处理paint命令的部分(sock是套接字的arraylist,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));
}
答案 0 :(得分:1)
我认为您的问题可能与您的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
即可将数据发送到您的服务器。希望这有帮助!