代码部分
服务器端获取客户端字符串
Server1.java
/**
* 演示客户端连接(服务器端)
* @author soft01
*/
public class Server1 {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(6666);
Socket socket = ss.accept();
//当客户端发起请求时才会响应
//获取服务器端IP地址
System.out.println("服务器LocalAddress:" + socket.getLocalAddress()); //服务器LocalAddress:/127.0.0.1
//获取服务器端端口号
System.out.println("服务器LocalPort:" + socket.getLocalPort()); //服务器LocalPort:6666
//获取客户端地址
System.out.println("客户端InetAddress:" + socket.getInetAddress()); //客户端InetAddress:/127.0.0.1
//获取客户端端口号
System.out.println("客户端Port:" + socket.getPort()); //客户端Port:41704 随机
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String str = br.readLine(); //readLine():表示按行读取【客户端中println必须加ln,否则读取不到报错null!】
System.out.println("收到客户端发来的消息:" + str);
socket.close();
}
}
Client1.java
/**
* 演示服务器端连接(客户端)
* @author soft01
*/
public class Client1 {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 6666);
//获取服务器端IP地址
System.out.println("服务器LocalAddress:" + socket.getLocalAddress()); //服务器LocalAddress:/127.0.0.1
//获取服务器端端口号
System.out.println("服务器LocalPort:" + socket.getLocalPort()); //服务器LocalPort:41704 随机
//获取客户端地址
System.out.println("客户端InetAddress:" + socket.getInetAddress()); //客户端InetAddress:/127.0.0.1
//获取客户端端口号
System.out.println("客户端Port:" + socket.getPort()); //客户端Port:6666
//通过socket去获取输出流,返回类型是OutputStream类型
OutputStream os = socket.getOutputStream();
//OutputStreamWriter:表示用来接收os,并且设置字符集编码(utf-8)【目的为了防止出现乱码】
OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
BufferedWriter bw = new BufferedWriter(osw);
//打印流:按行写字符串,并且自动刷新,默认是false,是不刷新的
PrintWriter pw = new PrintWriter(bw, true);
pw.println("服务端,你好!");
//关流!
socket.close();
}
}
练习:
客户端输入到控制台字符串,服务器端获取
注:客户端可多次在控制台输入字符串,即:客户端可给服务器端进行通信
Server2.java
/**
* 演示服务器端连接(客户端)
* @author soft01
*/
public class Client1 {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 6666);
//获取服务器端IP地址
System.out.println("服务器LocalAddress:" + socket.getLocalAddress()); //服务器LocalAddress:/127.0.0.1
//获取服务器端端口号
System.out.println("服务器LocalPort:" + socket.getLocalPort()); //服务器LocalPort:41704 随机
//获取客户端地址
System.out.println("客户端InetAddress:" + socket.getInetAddress()); //客户端InetAddress:/127.0.0.1
//获取客户端端口号
System.out.println("客户端Port:" + socket.getPort()); //客户端Port:6666
//通过socket去获取输出流,返回类型是OutputStream类型
OutputStream os = socket.getOutputStream();
//OutputStreamWriter:表示用来接收os,并且设置字符集编码(utf-8)【目的为了防止出现乱码】
OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
BufferedWriter bw = new BufferedWriter(osw);
//打印流:按行写字符串,并且自动刷新,默认是false,是不刷新的
PrintWriter pw = new PrintWriter(bw, true);
pw.println("服务端,你好!");
//关流!
socket.close();
}
}
Client2.java
/**
* 演示服务器端连接(客户端)
* @author soft01
*/
public class Client2 {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 7777);
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(bw, true);
Scanner sc = new Scanner(System.in);
while (true) {
String msg = sc.nextLine();
pw.println(msg);
}
}
}
注:统一局域网可访问,修改客户端中的IP地址,另一台电脑先开服务器,本机开客户端并在控制台输入字符串,另一台电脑会显示受到客户端发来信息。重新访问自己的本机地址须修改为localhost
聊天室客户端v1.0
指定ip地址和端口号进行访问
Server3.java
/**
* 演示客户端连接(服务器端)
* @author soft01
*/
public class Server3 {
public static void main(String[] args) {
try {
System.out.println("服务器正在启动...");
ServerSocket ss = new ServerSocket(9999);
Socket socket = ss.accept();
System.out.println("一个客户端已经连接了...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Client3.java
/**
* 演示服务器端连接(客户端)
* @author soft01
*/
public class Client3 {
/**
* 主方法
* @param args
*/
public static void main(String[] args) {
//创建本类对象,默认会去执行无参构造方法
Client3 client = new Client3();
}
/**
* 无参构造方法
*/
public Client3() {
System.out.println("无参构造方法已经执行...");
/* 创建窗体 */
JFrame jFrame = new JFrame("聊天室客户端v1.0版");
//JOptionPane:有助于方便的弹出要求用户提供值或者是向它发出标准对话框
//showInputDialog:提示要求输入内容 -提示语句
String ip = JOptionPane.showInputDialog(jFrame, "请输入服务器的地址"); //获取ip
String port = JOptionPane.showInputDialog(jFrame, "请输入端口号"); //获取端口号
int port1 = Integer.parseInt(port);
try {
Socket socket = new Socket(ip, port1);
} catch (Exception e) {
//打印栈信息:如果出现异常信息,直接打印到控制台
e.printStackTrace();
}
/* 内容准备 */
JTextArea jTextArea = new JTextArea(20, 40); //构造具有指定行数(参数1)和列数(参数2)的JTextArea
jTextArea.setFont(new Font("宋体", Font.BOLD, 24)); //设置字体,指定字体为宋体,加粗,24号字
jTextArea.setEditable(false); //设置聊天室窗口不可编辑
JTextField jTextField = new JTextField(30); //创建文本输入框,行数(参数1)
JButton jButton = new JButton("发送"); //创建发送按钮
String name = JOptionPane.showInputDialog(jFrame, "请输入你的名字"); //获取访客名称
JLabel jLabel = new JLabel(name + ":"); //创建标签
/* 内容放入布局 */
//JScrollPane:表示可滚动面板
JScrollPane jScrollPane = new JScrollPane(jTextArea);
//BorderLayout:表示网格布局【CENTER、EAST、WEST、SOURTH、NORTH】
jFrame.add(jScrollPane, BorderLayout.CENTER); //将面板放入布局中
JPanel jPanel = new JPanel(); //创建画笔
jPanel.add(jLabel); //添加标签
jPanel.add(jTextField); //添加文本输入框
jPanel.add(jButton); //添加按钮
jFrame.add(jPanel, BorderLayout.SOUTH); //将画笔放入布局中
/*
* jPanel.add(jPanel, BorderLayout.SOUTH); 即将面板添加到面板当中,会报下面错误
* Exception in thread "main" java.lang.IllegalArgumentException: adding container's parent to itself
* at cn.tedu.lt.Client3.<init>(Client3.java:63) 在第63行,没有进行初始化【需要init初始化方法,说明没有把面板添加到窗体中】
*/
/* 窗体设置 */
jFrame.setSize(800, 600); //设置窗体大小
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置在关闭时不执行任何操作,关闭是指在控制台的关闭
jFrame.setLocationRelativeTo(null); //设置窗体位置,默认为居中
jFrame.setVisible(true); //设置可见
}
// private void init() {
//
// }
}
效果图:
代码优化
Server4.java
/**
* 演示客户端连接(服务器端)
* @author soft01
*/
public class Server4 {
public static void main(String[] args) {
try {
System.out.println("服务器正在启动...");
ServerSocket ss = new ServerSocket(9999);
Socket socket = ss.accept();
System.out.println("一个客户端已经连接了...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Client4.java
/**
* 演示服务器端连接(客户端)
* @author soft01
*/
public class Client4 {
private final JFrame jFrame; //窗体
/* 聊天内容 */
private final JTextArea jTextArea; //文本域
private final JTextField jTextField; //文本框
private final JButton jButton; //按钮
private final String name; //用户名
private final JLabel jLabel; //标签
private Socket socket; //地址ip会发生变化,不能用final
/* tips:不能final声明 */
private JScrollPane jScrollPane; //面板
private JPanel jPanel; //画笔
/**
* 主方法
* @param args
*/
public static void main(String[] args) {
//创建本类对象,默认会去执行无参构造方法
Client4 client = new Client4();
client.showMe();
}
/**
* 无参构造方法
*/
public Client4() {
System.out.println("无参构造方法已经执行...");
/* 创建窗体 */
jFrame = new JFrame("聊天室客户端v1.0版");
//JOptionPane:有助于方便的弹出要求用户提供值或者是向它发出标准对话框
//showInputDialog:提示要求输入内容 -提示语句
String ip = JOptionPane.showInputDialog(jFrame, "请输入服务器的地址"); //获取ip
String port = JOptionPane.showInputDialog(jFrame, "请输入端口号"); //获取端口号
int port1 = Integer.parseInt(port);
try {
socket = new Socket(ip, port1);
} catch (Exception e) {
//打印栈信息:如果出现异常信息,直接打印到控制台
e.printStackTrace();
}
/* 内容准备 */
jTextArea = new JTextArea(20, 40); //构造具有指定行数(参数1)和列数(参数2)的JTextArea
jTextArea.setFont(new Font("宋体", Font.BOLD, 24)); //设置字体,指定字体为宋体,加粗,24号字
jTextArea.setEditable(false); //设置聊天室窗口不可编辑
jTextField = new JTextField(30); //创建文本输入框,行数(参数1)
jButton = new JButton("发送"); //创建发送按钮
name = JOptionPane.showInputDialog(jFrame, "请输入你的名字"); //获取访客名称
jLabel = new JLabel(name + ":"); //创建标签
init(); //初始化方法
}
/**
* 内容放入布局初始化方法
*/
private void init() {
//JScrollPane:表示可滚动面板
jScrollPane = new JScrollPane(jTextArea);
//BorderLayout:表示网格布局【CENTER、EAST、WEST、SOURTH、NORTH】
jFrame.add(jScrollPane, BorderLayout.CENTER); //将面板放入布局中
jPanel = new JPanel(); //创建画笔
jPanel.add(jLabel); //添加标签
jPanel.add(jTextField); //添加文本输入框
jPanel.add(jButton); //添加按钮
jFrame.add(jPanel, BorderLayout.SOUTH); //将画笔放入布局中
}
/**
* 窗体设置方法(显示)
*/
private void showMe() {
jFrame.setSize(800, 600); //设置窗体大小
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置在关闭时不执行任何操作,关闭是指在控制台的关闭
jFrame.setLocationRelativeTo(null); //设置窗体位置,默认为居中
jFrame.setVisible(true); //设置可见
}
}
效果图同上