Java客户端与服务器端的超简易通讯3

来源:互联网 发布:教程网站源码 编辑:程序博客网 时间:2024/05/16 11:18

上一片文章Java客户端与服务器端的超简易通讯2主要想实现的效果是:在客户端输入一些数据(例如:"Hello ServerSocket!"),并将这些数据发送给服务器端,在服务器端判断这些数据是否是服务器想要的,若为想要的,则返回数据给客户端(例如:"Hi Socket!"),并把客户端和服务器端所接收的数据都将其输出,而这篇文章想实现的效果是:重点是多客户端与服务器交互。即:每个客户端和都可以发送一段字符串给服务器,而服务器也返回一个字段给客户端(本文是返回“XIXI”字符串)。

因为是多客户端与服务器的交互,假如还是像前两篇文章,服务器直接在一个主线程中处理客户端所发的信息,那是不明智的。因为当多个客户端同时发送请求的时候,服务器处理不过来,会卡住或直接崩溃。因此,我需要用到多线程的知识,每当一个客户端发送一个请求过来,就使用一个子线程去处理它。OK,思路说完,看代码来认识或熟悉一下。


客户端的代码和之前差不多,没有多少改变。但还是贴上看看。吐舌头(随便一提,接下来的代码,注释将不会像之前那么详细,若不懂,建议看看之前两篇文章)

import java.io.DataInputStream;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintStream;import java.net.Socket;import java.util.Scanner;/** * 客户端代码 *  */public class ClientSocket {public static void main(String[] args) {try {// 创建一个socket,并开始连接服务器Socket s = new Socket("192.168.1.105", 80);// "192.168.1.105"为服务器的ip地址,80为服务器的端口后,这两个都不是固定的。//创建一个Scanner对象,用于输入Scanner sc = new Scanner(System.in);String socketData = sc.nextLine();// 创建一个输出流OutputStream os = s.getOutputStream();// 创建一个字节打印流,便于将数据储存到输出流中PrintStream ps = new PrintStream(os);// 将所输入的数据打印到输出流中ps.println(socketData);//创建一个输入流,用于读取用服务器中返回的数据InputStream is = s.getInputStream();//创建一个DataInputStream对象,便于读取输入流中的数据DataInputStream dis = new DataInputStream(is);//已UTF-8的格式读取输入流中的数据String request = dis.readLine();//输出所读取的数据System.out.println(request);// 关闭流对象,释放资源s.close();ps.close();os.close();is.close();dis.close();} catch (Exception e) {// 将错误报告输出e.printStackTrace();}}}

关于服务器的代码分两份,第一份是获取客户端的Socket对象,第二份是在一个线程(Thread)中处理数据,以下第一份:

import java.io.IOException;import java.net.ServerSocket;public class ServerSocket2 {public static void main(String[] args) {// TODO Auto-generated method stubboolean cycleBool = true;//用于控制循环int num = 0;//输出客户端发送信息的次数try {ServerSocket ss = new ServerSocket(80);while (cycleBool) {ServerSocketThread sst = new ServerSocketThread(ss.accept(),num);sst.start();//开启线程System.out.println("num------->" + num++);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

以下为第二份为线程代码,若还不懂线程是什么的话,建议先去网上看看相关的知识点或教程再看这里的代码:

import java.io.DataInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintStream;import java.net.Socket;public class ServerSocketThread extends Thread {private Socket s;private int num;public ServerSocketThread(Socket s, int num) {// TODO Auto-generated constructor stubthis.s = s;this.num = num;}@Overridepublic void run() {try {//输入流的获取和处理InputStream is = s.getInputStream();DataInputStream dis = new DataInputStream(is);String request = dis.readLine();System.out.println(request);//输出流OutputStream os = s.getOutputStream();PrintStream ps = new PrintStream(os);ps.println("XIXI");s.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

好了,代码就是以上这些,下面来看看运行的效果:

多客户端运行效果:

客户端1运行效果:多客户端运行图片1

客户端2运行效果:多客户端运行图片2


服务器运行效果:

服务器运行效果:



本文代码:

Java客户端与服务器端的超简易通讯3

0 0
原创粉丝点击