实习第一周,由于后续的项目需要大量用到socket方面的知识,导师第一周给的任务是写一个设计一个基于最基本Socket的P2P“聊天软件”(文本互传),要求在同一个网关内可以通过任意常用端口建立会话并进行socket通讯、双向文本收发。于是开始了面向百度编程。
socket这一块搞的晕头转向,最后好歹也是明白了
不知道是什么问题最后运行还是Connection refused: connect
搜了一堆都说断口冲突了,但是改了端口还是连不上 求大神解答
//服务端
package com.fang;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Properties;
public class Server extends JFrame implements ActionListener {
// 属性
// frame组件
//private JFrame jFrame;
// 文本区
private JTextArea jTextArea;
// 滚动条
private JScrollPane jScrollPane;
//面板 → (文本框 + 发送按钮)
private JPanel jPanel;
private JTextField jTextField;
private JButton jButton;
private BufferedWriter bufferedWriter;
private static int serverPort;
static {
Properties properties = new Properties();
try {
properties.load(new FileReader("chat.properties"));
serverPort = Integer.parseInt(properties.getProperty("serverPort"));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//方法
//构造方法
public Server() {
// 文本区放入滑动组件
jTextArea = new JTextArea();
// 自动滚动 + 不可编辑
jTextArea.setAutoscrolls(true);
jTextArea.setEditable(false);
jScrollPane = new JScrollPane(jTextArea);
// 好像不能这么写
// jScrollPane.add(jTextArea);
// 按钮+文本框 放入 panel 组件 分别放在东西两侧
jButton = new JButton("SEND");
jTextField = new JTextField(20);
jPanel = new JPanel();
jPanel.add(jTextField, BorderLayout.WEST);
jPanel.add(jButton, BorderLayout.EAST);
// 滚动组件 + panel 添加到 frame 组件 并滚动组件放到中间,panel放到南部
this.add(jPanel, BorderLayout.SOUTH);
this.add(jScrollPane, BorderLayout.CENTER);
// 标题 尺寸
this.setTitle("对话-服务端");
this.setSize(500, 400);
this.setLocation(600, 300);
// 设置事件 静态方法 当jframe关闭时触发对象结束
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
//TCP协议
// 给按钮绑定监听事件
jButton.addActionListener(this);
try {
// 1. 创建套接字 选择一个端口-6666
ServerSocket serverSocket = new ServerSocket(serverPort);
// 2. 等待客户端连接 返回socket对象
Socket socket = serverSocket.accept();
// System.out.println("连接完成");
// 3. 获取socket 先获取输入流 然后获取输入流读取对象 最后使用BufferedReader 对象逐行获取输入
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = bufferedReader.readLine();
while (line != null) {
jTextArea.append(line + System.lineSeparator());
}
// 4. 输出流
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
bufferedWriter = new BufferedWriter(outputStreamWriter);
// 4. 关掉套接字
serverSocket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* Invoked when an action occurs.
*
* @param e the event to be processed
*/
@Override
public void actionPerformed(ActionEvent e) {
//System.out.println("我被点击");
//获取文本框输入的内容
String text = jTextField.getText();
text = "SERVER: " + text;
//在自己的文本区显示
jTextArea.append(text);
//实现发送
// Connection refused: connect 无法实现 bufferedWriter 对象的使用
try {
bufferedWriter.write(text);
bufferedWriter.newLine(); //换行
bufferedWriter.flush(); //刷新
jTextField.setText("");
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
//客户端
package com.fang;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;
import java.util.Properties;
public class Client extends JFrame implements ActionListener {
// 属性
// frame组件
//private JFrame jFrame;
// 文本区
private JTextArea jTextArea;
// 滚动条
private JScrollPane jScrollPane;
//面板 → (文本框 + 发送按钮)
private JPanel jPanel;
private JTextField jTextField;
private JButton jButton;
private BufferedWriter bufferedWriter;
private static int clientPort;
static {
try {
Properties properties = new Properties();
FileReader fileReader = new FileReader("chat.properties");
properties.load(fileReader);
clientPort = Integer.parseInt(properties.getProperty("clientPort"));
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//方法
//构造方法
public Client() {
// 文本区放入滑动组件
jTextArea = new JTextArea();
// 自动滚动 + 不可编辑
jTextArea.setAutoscrolls(true);
jTextArea.setEditable(false);
jScrollPane = new JScrollPane(jTextArea);
// 好像不能这么写
// jScrollPane.add(jTextArea);
// 按钮+文本框 放入 panel 组件 分别放在东西两侧
jButton = new JButton("SEND");
jTextField = new JTextField(20);
jPanel = new JPanel();
jPanel.add(jTextField, BorderLayout.WEST);
jPanel.add(jButton, BorderLayout.EAST);
// 滚动组件 + panel 添加到 frame 组件 并滚动组件放到中间,panel放到南部
this.add(jPanel, BorderLayout.SOUTH);
this.add(jScrollPane, BorderLayout.CENTER);
// 标题 尺寸
this.setTitle("对话-客户端");
this.setSize(500, 400);
this.setLocation(600, 300);
// 设置事件 静态方法 当jframe关闭时触发对象结束
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//TCP协议
// 给SEND按钮绑定监听点击事件
jButton.addActionListener(this);
try {
// 1. 创建套接字 选择一个端口-6666
/*Socket socket = new Socket();*/
// 2. 创建socket对象 实现与服务端连接
Socket socket = new Socket("127.0.0.1", clientPort);
// 3. 获取socket 先获取输入流 然后获取输入流读取对象 最后使用BufferedReader 对象逐行获取输入
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = bufferedReader.readLine();
while (line != null) {
jTextArea.append(line + System.lineSeparator());
}
// 4. 输出流
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
bufferedWriter = new BufferedWriter(outputStreamWriter);
// 4. 关掉套接字
socket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* Invoked when an action occurs.
*
* @param e the event to be processed
*/
@Override
public void actionPerformed(ActionEvent e) {
//System.out.println("我被点击");
//获取文本框输入的内容
String text = jTextField.getText();
text = "CLIENT: " + text;
//在自己的文本区显示
jTextArea.append(text);
//实现发送
// Connection refused: connect 无法实现 bufferedWriter 对象的使用
try {
bufferedWriter.write(text);
bufferedWriter.newLine(); //换行
bufferedWriter.flush(); //刷新
jTextField.setText("");
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
/*public Client(JTextArea jTextArea, JScrollPane jScrollPane01, JPanel jPanel, JTextField jTextField, JButton jButton) {
this.jTextArea = jTextArea;
this.jScrollPane = jScrollPane01;
this.jPanel = jPanel;
this.jTextField = jTextField;
this.jButton = jButton;
}*/
}