Java Canvas 绘图套接字

标签 java sockets canvas

我有以下两个功能

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/

相关文章:

java - 如何为 Java 源文件中的多个问题编写 Eclipse QuickFix

java - 为什么我在使用 hibernate.hbm2ddl.auto 和 H2 时遇到异常,但使用 PostgreSQL 却可以正常工作?

java - Windows 7 上的 AVD 无法连接到 Linux 服务器

c# - 从 C# 中的另一个线程修改类属性

javascript - 如何提高该功能的性能?

javascript - 使用 Knockout.js 将 Canvas 绑定(bind)到 UI

canvas - 如何在 Canvas 中绘制带有圆形边框的图像?

java - JLayeredPane 未使用 JFrame 调整大小

Java并发,在父线程中设置flag

python - 使用 Nginx 和 Django 设置 Unix Socket