Java网络编程——服务器端和客户端互发信息

引言

?
?

为了学习Java网络编程,用一个QQ(屌丝版)作为例子练手,记录屌丝版QQ的开发过程,这里我们认为已经掌握其中的网络基础部分,即HTTP协议,TCP/IP协议等,在此基础上我们开始我们的Java网络部分的学习,我们要知道服务器和客户端是如何通信的,首先我们要了解Java网络知识中的一个很重要的东西——Socket

?
?

Socket初探

?
?

ServerSocket和Socket

?
?

首先服务器端需要用到java.net包下的ServerSocket类,该类的一个实例用于监听等待客户端的连接,而客户端需要用到net包下的Socket类,用于向服务器端发送连接请求,客户端是怎样与服务器端建立连接的呢,首先客户端的Socket实例要制定服务器端的ip地址和端口,服务器端如何与客户端建立连接呢,服务器端的ServerSocket类的accept一直在监听等待客户端发来的连接请求,如果没有收到,则一直阻塞在accept这句代码这儿(可以在Socket s=ss.accept();这行代码后面打印出一句语句,可以发现,程序并不会执行到这行代码),以下代码1说明服务器端ServerSocket的用法,代码2说明客户端Socket的用法

?
?

代码1

?
?

创建一个类,名字叫Server,在类的构造函数中创建ServerSocket等实例

?
?

public class MyServer1 {

public MyServer1()

{

//在9999号端口监听

ServerSocket ss=new ServerSocket(9999);

//等待某个客户端来连接,该函数会返回一个Scoket连接

Socket s=ss.accept();

}

?
?

}

?
?

代码2

?
?

创建一个类,名字叫Client

?
?

public class MyClient1 {

public MyClient1()

{

//Socket,就是连接某个服务器端,127.0.0.1表示服务器的Ip 9999表示端口号

Socket s=new Socket("127.0.0.1", 9999);

}

}

?
?

服务器和客户端互发信息

?
?

服务器端和客户端是如何发送信息的呢,用到的还是java.io包下的东西,服务器端要读取客户端发来的信息,用到InputStreamReader,BufferedReader,其中InputStreamReader的输入为Socket.getInputStream()方法返回的输入流,要发送信息给客户端用到PrintWriter,其中PrintWriter的输入为Socket.getOutputStream()方法返回的输出流,具体用法如下

?
?

客户端发送信息

//如果s连接成功,
就可以发数据给服务器

//我们通过pw向s写数据 true表示刷新流

PrintWriter pw=new PrintWriter(s.getOutputStream(),true);

pw.println("Hello Server,I‘m Client");

?
?

服务器端接受信息

//要读取s中传递的数据

InputStreamReader isr=new InputStreamReader(s.getInputStream());

BufferedReader br=new BufferedReader (isr);

//行读取

String info=br.readLine();

System.out.println("服务器收到的信息是,"+info);

?
?

然后服务器端向客户端发送信息

PrintWriter pw=new PrintWriter(s.getOutputStream(), true);

pw.println("Hello Client,I‘m Server");

?
?

然后客户端收到服务器端的信息

InputStreamReader isr=new InputStreamReader(s.getInputStream());

BufferedReader br=new BufferedReader (isr);

//行读取

String response=br.readLine();

System.out.println("客户端收到的信息是,"+response);

?
?

服务器和客户端互发信息(从控制台输入)

?
?

之前服务器和客户端互发的信息是写死在pw.println里,我们稍微修改一下,从控制台输入

?
?

之前建立连接的方式相同,而且读取和发送信息的方式也类似,只是多了一个需要从控制台输入信息

?
?

服务器端代码

?
?

比如服务器端接受客户端发来的信息依旧不变,从Socket.getInputStream()方法返回的输入流作为InputStreamReader的输入

?
?

但服务器端还需要一个InputStreamReader接受从System.in传进来的输入用来接收从控制台输入的想发送给客户端的信息

?
?

//接受客户端发来的信息

InputStreamReader isr=new InputStreamReader(s.getInputStream());

BufferedReader br=new BufferedReader(isr);

//打印客户端发来的信息

String infoFromClient=br.readLine();

System.out.println("客户端发来"+infoFromClient);

?
?

//接收从控制台输入的信息

InputStreamReader isr2=new InputStreamReader(System.in);

BufferedReader br2=new BufferedReader(isr2);

//打印从控制台输入的信息

System.out.println("输入要发送给客户端的信息");

String response=br2.readLine();

?
?

客户端的代码

?
?

而客户端代码也类似

?
?

InputStreamReader isr=new InputStreamReader(System.in);

BufferedReader br=new BufferedReader(isr);

?
?

InputStreamReader isr2=new InputStreamReader(s.getInputStream());

BufferedReader br2=new BufferedReader(isr2);

?
?

服务器和客户端互发信息(从聊天窗口输入)

?
?

有了第一个的基础,这一部分就只是将从控制台输入变成了从JTextArea域里读取文字,这里我们暂且认为已有Java界面的基础,对JFrame了解

?
?

这一部分我们希望客户端发来的消息显示在聊天窗口中,而不是控制台,那么将

System.out.println("客户端发来"+infoFromClient);替代为jta.append("客户端发来"+info+"\r\n");即可

?
?

另外我们希望客户端发给服务器的消息也从聊天窗口输入,那么我们需要继承ActionListener,实现当点击发送按钮时,读取JTextField域的文字,具体实现如下

?
?

String info=jtf.getText();

pw.println(info);

//清空发送框的内容

jtf.setText("");

?
?

?
?

时间: 2024-11-03 21:45:16

Java网络编程——服务器端和客户端互发信息的相关文章

Java网络编程 - 服务器端和客户端的连接和信息传递实现

1.Client(客户端代码) package cn.qi.Client; import java.io.*; import java.net.Socket; public class Client { Socket clientSocket; Client() {} public void write() throws IOException { // 建立连接到服务器端的socket clientSocket = new Socket("127.0.0.1",5000); // 客

java网络编程框架

虽然写过一些网络编程方面的东西,但还没有深入研究过这方面的内容,直接摘录一些文章,后续整理 原文地址:http://blog.csdn.net/lwuit/article/details/7306139 自从JDK1.4中有了NIO以后,这个方面越来越活跃,也为java赢得更多开发者的支持.做java网络编程需要掌握一些基本的知识和技能:套接字编程.阻塞/非阻塞通信.创建HTTP服务器与客户程序.数据报通信.对象的序列化与反序列化.Java反射机制.RMI框架.JDBC API.JavaMail

Java网络编程【Socket服务端和客户端】

Socket 编程大家都不陌生,Java 学习中必学的部分,也是 Java网络编程核心内容之一.Java 网络编程又包括 TCP.UDP,URL 等模块.TCP 对应 Socket模块,UDP 对应 DatagramPacket 模块.URL 对应 URL 模块.其中 TCP 和 UDP 是网络传输协议,TCP 是数据流传输协议,UDP 是数据包传输协议.两者之间的异同就不在这里说了,推荐一本入门书籍 <TCPIP入门经典>.我们开始 Socket 服务端和客户端编程吧. 一.Socket 服

Java网络编程和NIO详解开篇:Java网络编程基础

Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为我们拥有网络.网络是一个神奇的东西,它改变了你和我的生活方式,改变了整个世界. 然而,网络的无标度和小世界特性使得它又是复杂的,无所不在,无所不能,以致于我们无法区分甚至无法描述. 对于一个码农而言,了解网络的基础知识可能还是从了解定义开始,认识OSI的七层协议模型,深入Socket内部,进而熟练地

Java网络编程基础(六)— 基于TCP的NIO简单聊天系统

在Java网络编程基础(四)中提到了基于Socket的TCP/IP简单聊天系统实现了一个多客户端之间护法消息的简单聊天系统.其服务端采用了多线程来处理多个客户端的消息发送,并转发给目的用户.但是由于它是基于Socket的,因此是阻塞的. 本节我们将通过SocketChannel和ServerSocketChannel来实现同样的功能. 1.客户端输入消息的格式 username:msg    username表示要发送的的用户名,msg为发送内容,以冒号分割 2.实现思路 实现思路与Java网络

java网络编程socket解析

转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在C/S通信模式中,client需要主动创建于server连接的Socket(套接字).服务器端收到了客户端的连接请求,也会创建与客户连接的Socket.Socket可看做是通信两端的收发器.server与client都通过Socket来收发数据. 1.构造Socket 1.Socket() 2.So

实验五Java网络编程及安全——20135337朱荟潼

实验五 Java网络编程及安全 结对伙伴:20135317韩玉琪(负责服务器方)http://www.cnblogs.com/hyq20135317/p/4567241.html 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全 实验步骤 1.信息安全传送: 发送方A——————>接收方B A加密时,用B的公钥 B解密时,用B的私钥 发送方A对信息(明文)采用DES密钥加密,使用RSA加密前面的DES密钥信息,最终将混合信息进行传递.同时用hash函数将明文进行

Java网络编程基础【转】

网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛,很简单的事情啊!其实初学者如果入门网络编程的话也可以做到这么简单! 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.

JAVA网络编程-----tcp

java采用TCP传输时利用Socket和ServerSocket Socket和ServerSocket 建立客户端和服务端 建立连接后,通过Socket中的IO流进行数据的传输. 关闭Socket 同样,客户端与服务端是两个独立的应用程序. 演示tcp传输 1.   tcp分客户端和服务端 2.   客户端对应的对象是Socket,服务端对应的对象是ServerSocket. 客户端: 通过查阅socket对象,发现在该对象建立时,就可以连接指定主机, 因为tcp是面向连接的,所以在建立so