Java实验———基于GUI的网络通信程序设计
实验内容:编写程序完成以下功能:
- 1.设计一个基于GUI的客户-服务器的通信应用程序,如图1,图2所示。
图1 Socket通信服务器端界面 图2 Socket通信客户端界面 - 2.图1为Socket通信服务器端界面,点击该界面中的【Start】按钮,启动服务器监听服务(在图1界面中间的多行文本区域显示“Server starting…”字样)。图2为Socket通信客户端界面,点击该界面中的【Connect】按钮与服务器建立链接,并在图2所示界面中间的多行文本区域显示“Connect to server…”字样,当服务器端监听到客户端的连接后,在图1界面中间的多行文本区域追加一行“Client connected…”字样,并与客户端建立Socket连接。
- 3.当图1所示的服务器端和图2所示的客户机端建立Socket连接后,编程实现服务端、客户端之间的“单向通信”:在客户端的输入界面发送消息,在服务端接收该消息,并将接收到对方的数据追加显示在多行文本框中。
实验代码:
服务器:
package Practice1;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
class myServerFrame extends JFrame implements ActionListener {
JPanel panel1,panel2,panel3;
Label label1,label2;
Button button1,button2;
TextArea textarea;
TextField textfile1,textfile2;
ServerSocket server;
static Socket socket; //声明通信界面的组件,其中声明Socket为静态变量供不同线程使用
public myServerFrame(){
super("服务器");
this.setBounds(700,100,500,500);
this.setLayout(new BorderLayout()); //设置Frame标题、大小、边界和布局器
panel1=new JPanel();
panel1.setBackground(new Color(0xF7F7FD));
panel1.setPreferredSize(new Dimension(500, 80));
panel1.setBorder(BorderFactory.createTitledBorder("服务器设置"));
label1=new Label("Port:");
label1.setFont(new Font("Dialog", 1, 15));
panel1.add(label1);
textfile1=new TextField(45);
panel1.add(textfile1);
button1=new Button("start");
button1.addActionListener(this); //为button1注册监听器
panel1.add(button1);
this.add(panel1,BorderLayout.NORTH); //设置并添加panel1、label、textfiled和Button
panel2=new JPanel();
panel2.setBackground(new Color(0xF7F7FD));
textarea=new TextArea(18,60);
panel2.add(textarea);
this.add(panel2,BorderLayout.CENTER); //设置并添加panel2、textarea
panel3=new JPanel();
panel3.setBackground(new Color(0xF7F7FD));
panel3.setPreferredSize(new Dimension(500, 60));
label2=new Label("Say");
label2.setFont(new Font("Dialog", 1, 15));
panel3.add(label2);
textfile2=new TextField(50);
panel3.add(textfile2);
button2=new Button("Say");
button2.addActionListener(this);
panel3.add(button2);
this.add(panel3,BorderLayout.SOUTH); //设置panel3,label,textfile和button,并为button添加监听器
this.setVisible(true); //设置Frame可见
this.addWindowListener(new WindowAdapter() { //为关闭程序添加监听器
@Override
public void windowClosing(WindowEvent e) {
System.exit(1);
}
});
}
public void start()throws IOException { //按下按钮start时在聊天区域输出start connect..并将文本框的内容转化为端口号
this.textarea.append("start connect......\n");
int ports = Integer.valueOf(this.textfile1.getText());
server = new ServerSocket(ports);
socket = server.accept();
Runnable r=new Runnable() { //使用线程使serversocket保持开启,随时接收socket发来的信息
@Override
public void run() {
byte[] bytes = new byte[1024];
int len = 0;
while (true) {
try {
InputStream is = socket.getInputStream();
while ((len = is.read(bytes)) != -1) {
textarea.append(new String(bytes, 0, len)+'\n');
}
} catch (IOException je) {
System.out.println(je);
}
}
}
};
Thread thread=new Thread(r);
thread.start();
}
public void DataOutput(){ //按下按钮Say时将聊天文本框中的内容发送给客户端
String string=textfile2.getText();
try {
OutputStream os=socket.getOutputStream();
os.write(("服务器:"+string).getBytes());
System.out.println("已发送");
}catch(IOException ie){
System.out.println(ie);
}
}
@Override
public void actionPerformed(ActionEvent e) { //两个按钮的监听器,分别对应创建Sockrt功能和发送信息功能
if(e.getSource()==button1){
try{
this.start();
}catch(IOException ie){
System.out.println("start异常");
}
}
else if(e.getSource()==button2){
System.out.println("感应到Say");
DataOutput();
}
}
}
public class mySeverSocket {
public static void main(String[] args) {
myServerFrame msf=new myServerFrame();
}
}
客户端:
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
class myFrame extends JFrame implements ActionListener {
JPanel panel1, panel2, panel3;
Label label1, label2, label3, label4;
TextField text1, text2, text3, text4;
TextArea textarea;
Button button1, button2;
static Socket socket; //声明通信界面的组件,其中声明Socket为静态变量供不同线程使用
public myFrame() {
super("客户端");
setBounds(100, 100, 500, 500);
setLayout(new BorderLayout()); //设置Frame标题、位置、大小和布局类型
//采用BorderLayout,添加三个Panel分别在South,Center,North位置
panel1 = new JPanel();
panel2 = new JPanel();
panel3 = new JPanel();
panel1.setBackground(new Color(0xF7F7FD));
panel1.setPreferredSize(new Dimension(500, 80));
panel1.setBorder(BorderFactory.createTitledBorder("客户端设置")); //设置panel大小,背景颜色和带标题边框
label2 = new Label("Server IP:");
label2.setFont(new Font("Dialog", 1, 15)); //设置标签1 Server Ip
label3 = new Label("Server Port:");
label3.setFont(new Font("Dialog", 1, 15)); //设置标签2 Server Port
text1 = new TextField(10);
text2 = new TextField(10); //加入文本框并设置列数
button1 = new Button("Connent");
button1.addActionListener(this); //添加按钮Connect,为按钮注册监听器
panel1.add(label2);
panel1.add(text1);
panel1.add(label3);
panel1.add(text2);
panel1.add(button1);
panel2.setBackground(new Color(0xF7F7FD));
textarea = new TextArea(18, 60);
panel2.add(textarea); //设置panel2背景颜色、大小并添加文本区域,作聊天区域
panel3.setBackground(new Color(0xF7F7FD));
panel3.setPreferredSize(new Dimension(500, 60)); //设置并添加panel3
label4 = new Label("Say:");
label4.setFont(new Font("Dialog", 1, 15)); //设置并添加label Say
button2 = new Button("Say");
button2.addActionListener(this); //设置添加按钮 Say,并注册监听器
text4 = new TextField(50); //添加文本框作输入框
panel3.add(label4);
panel3.add(text4);
panel3.add(button2);
add(panel1, BorderLayout.NORTH);
add(panel2, BorderLayout.CENTER);
add(panel3, BorderLayout.SOUTH);
setVisible(true); //设置Frame可见
this.addWindowListener(new WindowAdapter() { //为退出注册监听器
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void CreateSocket()throws IOException{ //当按下按钮Connect,从文本框获取ip地址和端口号,创建socket
int ports=Integer.valueOf(this.text2.getText());
String string = text1.getText();
socket=new Socket(string,ports);
this.textarea.append("connect to server...\n"); //创建socket后在聊天区域输出connect to server...
OutputStream os=socket.getOutputStream();
os.write("Client connected......\n".getBytes()); //获取socket输出流并向服务器发送Client connected...
Runnable r=new Runnable() { //使用线程使socket保持开启,随时接收serversocket发来的信息
@Override
public void run() {
while(true) {
try {
InputStream is = socket.getInputStream();
int len = 0;
byte[] bytes = new byte[1024];
while ((len = is.read(bytes)) != -1) {
String string = new String(bytes, 0, len);
textarea.append(string + '\n');
}
}catch(IOException ie){
System.out.println(ie);
}
}
}
};
Thread thread=new Thread(r);
thread.start();
}
public void OutputData()throws IOException { //当按下按钮Say,将输入文本框的内容发送到服务器
System.out.println("已发送");
OutputStream os = socket.getOutputStream();
String string = text4.getText();
os.write(("客户端:"+string).getBytes());
}
@Override
public void actionPerformed(ActionEvent e) { //两个按钮的监听器,分别对应创建Sockrt功能和发送信息功能
if(e.getSource()==button1) {
try {
this.CreateSocket();
} catch (IOException ie) {
System.out.println(ie);
}
}
else if (e.getSource()==button2){
try{
this.OutputData();
}catch(IOException ie){
System.out.println(ie);
}
}
}
}
public class mySocket {
public static void main(String[] args) {
myFrame frame=new myFrame();
}
}