在swing applet中使用的套接字 [英] Socket using in a swing applet

查看:124
本文介绍了在swing applet中使用的套接字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我应该制作一台服务器& Java中的客户端,基于Swing和gui。我需要以某种方式建立一个从服务器到客户端,从客户端到服务器的套接字,并且会传递某种字符串。我希望以后有一个根据套接字中的字符串执行多项操作的函数。

由于某种原因,我找不到一个简单的代码示例,以简单的方式显示它是如何完成的。

任何人都有任何简单的例子或者可以解释它是如何完成的?

解决方案

基于此

  package net; 

import java.awt。*;
import java.awt.event。*;
import java.io. *;
import java.net。*;
import java.util.Scanner;
import javax.swing。*;
import javax.swing.text.DefaultCaret;

/ **
*一个简单的网络客户端 - 服务器对
* @http://stackoverflow.com/questions/3245805
* /
公共类Echo实现ActionListener,Runnable {

private static final String HOST =127.0.0.1;
private static final int PORT = 12345;
private final JFrame f = new JFrame();
private final JTextField tf = new JTextField(25);
私人决赛JTextArea ta = new JTextArea(15,25);
私人决赛JButton发送=新JButton(发送);
private volatile PrintWriter out;
私密扫描仪;
private Thread thread;
private kind kind;

public static enum Kind {

Client(100,Trying),Server(500,Awaiting);
private int offset;
私有字符串活动;

private Kind(int offset,String activity){
this.offset = offset;
this.activity = activity;
}
}

public Echo(善良种类){
this.kind = kind;
f.setTitle(Echo+ kind);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getRootPane()。setDefaultButton(send);
f.add(tf,BorderLayout.NORTH);
f.add(new JScrollPane(ta),BorderLayout.CENTER);
f.add(send,BorderLayout.SOUTH);
f.setLocation(kind.offset,300);
f.pack();
send.addActionListener(this);
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
DefaultCaret caret =(DefaultCaret)ta.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
显示(kind.activity + HOST +on port+ PORT);
thread = new Thread(this,kind.toString());
}

public void start(){
f.setVisible(true);
thread.start();
}

// @覆盖
public void actionPerformed(ActionEvent ae){
String s = tf.getText();
if(out!= null){
out.println(s);
}
display(s);
tf.setText();
}

// @覆盖
public void run(){
try {
Socket socket;
if(kind == Kind.Client){
socket = new Socket(HOST,PORT);
} else {
ServerSocket ss = new ServerSocket(PORT);
socket = ss.accept();
}
in = new Scanner(socket.getInputStream());
out = new PrintWriter(socket.getOutputStream(),true);
显示(已连接);
while(true){
display(in.nextLine());
}
} catch(例外e){
display(e.getMessage());
e.printStackTrace(System.err);
}
}

private void display(final String s){
EventQueue.invokeLater(new Runnable(){
// @ Override
public void run(){
ta.append(s +\ u23CE \ n);
}
});
}

public static void main(String [] args){
EventQueue.invokeLater(new Runnable(){
// @ Override
public void run(){
new Echo(Kind.Server).start();
new Echo(Kind.Client).start();
}
});
}
}


I should made a server & client in Java,based on Swing and gui.I neeed to make somehow a socket that will go from the server to the client and from the client to the server, and will pass some kind of a string.I would like to have later a function that would do several things according to the string that would be in the socket.
For some reason I couldn't find a simple example for code that shows how it's done in a simple way.
Anyone has any simple example or can explain how is it being done?

解决方案

Based on this example, here's a simple network client-server pair using Swing. Note some issues related to correct synchronization: The GUI itself is constructed on the event dispatch thread using invokeLater(). In addition, the code relies on the thread safety of append(). Finally, it incorporates a handy tip from the article Text Area Scrolling.

Update: In Java 7, append() is no longer marked as thread safe; invokeLater() is used in display() to sequence updates.

package net;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.Scanner;
import javax.swing.*;
import javax.swing.text.DefaultCaret;

/**
 * A simple network client-server pair
 * @http://stackoverflow.com/questions/3245805
 */
public class Echo implements ActionListener, Runnable {

    private static final String HOST = "127.0.0.1";
    private static final int PORT = 12345;
    private final JFrame f = new JFrame();
    private final JTextField tf = new JTextField(25);
    private final JTextArea ta = new JTextArea(15, 25);
    private final JButton send = new JButton("Send");
    private volatile PrintWriter out;
    private Scanner in;
    private Thread thread;
    private Kind kind;

    public static enum Kind {

        Client(100, "Trying"), Server(500, "Awaiting");
        private int offset;
        private String activity;

        private Kind(int offset, String activity) {
            this.offset = offset;
            this.activity = activity;
        }
    }

    public Echo(Kind kind) {
        this.kind = kind;
        f.setTitle("Echo " + kind);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getRootPane().setDefaultButton(send);
        f.add(tf, BorderLayout.NORTH);
        f.add(new JScrollPane(ta), BorderLayout.CENTER);
        f.add(send, BorderLayout.SOUTH);
        f.setLocation(kind.offset, 300);
        f.pack();
        send.addActionListener(this);
        ta.setLineWrap(true);
        ta.setWrapStyleWord(true);
        DefaultCaret caret = (DefaultCaret) ta.getCaret();
        caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
        display(kind.activity + HOST + " on port " + PORT);
        thread = new Thread(this, kind.toString());
    }

    public void start() {
        f.setVisible(true);
        thread.start();
    }

    //@Override
    public void actionPerformed(ActionEvent ae) {
        String s = tf.getText();
        if (out != null) {
            out.println(s);
        }
        display(s);
        tf.setText("");
    }

    //@Override
    public void run() {
        try {
            Socket socket;
            if (kind == Kind.Client) {
                socket = new Socket(HOST, PORT);
            } else {
                ServerSocket ss = new ServerSocket(PORT);
                socket = ss.accept();
            }
            in = new Scanner(socket.getInputStream());
            out = new PrintWriter(socket.getOutputStream(), true);
            display("Connected");
            while (true) {
                display(in.nextLine());
            }
        } catch (Exception e) {
            display(e.getMessage());
            e.printStackTrace(System.err);
        }
    }

    private void display(final String s) {
        EventQueue.invokeLater(new Runnable() {
            //@Override
            public void run() {
                ta.append(s + "\u23CE\n");
            }
        });
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            //@Override
            public void run() {
                new Echo(Kind.Server).start();
                new Echo(Kind.Client).start();
            }
        });
    }
}

这篇关于在swing applet中使用的套接字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆