基于JavaSocket网络编程的山寨QQ.docx
- 文档编号:17210094
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:16
- 大小:74.87KB
基于JavaSocket网络编程的山寨QQ.docx
《基于JavaSocket网络编程的山寨QQ.docx》由会员分享,可在线阅读,更多相关《基于JavaSocket网络编程的山寨QQ.docx(16页珍藏版)》请在冰点文库上搜索。
基于JavaSocket网络编程的山寨QQ
基于JavaSocket网络编程的山寨QQ
(学习韩顺平老师的视频整理出的笔记)
内容含盖:
1.Java面向对象编程
2.界面编程
3.网络编程
4.多线程
5.文件I/O操作
6.数据库操作
1、网络基础
TCP/IP协议
TransmissionControlProtocol/InternetProtocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。
TCP/IP定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。
协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
通俗而言:
TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。
而IP是给因特网的每一台电脑规定一个地址。
2、端口
端口详解
在开始讲什么是端口之前,我们先来聊一聊什么是port呢?
常常在网络上听说『我的主机开了多少的port,会不会被入侵呀!
?
或者是说『开那个port会比较安全?
又,我的服务应该对应什么port呀?
呵呵!
很神奇吧!
怎么一部主机上面有这么多的奇怪的port呢?
这个port有什么作用呢?
由于每种网络的服务功能都不相同,因此有必要将不同的封包送给不同的服务来处理,所以啰,当你的主机同时开启了FTP与WWW服务的时候,那么别人送来的资料封包,就会依照TCP上面的port号码来给FTP这个服务或者是WWW这个服务来处理,当然就不会搞乱啰!
(注:
嘿嘿!
有些很少接触到网络的朋友,常常会问说:
咦!
为什么你的计算机同时有FTP、WWW、E-Mail这么多服务,但是人家传资料过来,你的计算机怎么知道如何判断?
计算机真的都不会误判吗?
!
现在知道为什么了吗?
!
对啦!
就是因为port不同嘛!
你可以这样想啦,有一天,你要去银行存钱,那个银行就可以想成是主机,然后,银行当然不可能只有一种业务,里头就有相当多的窗口,那么你一进大门的时候,在门口的服务人员就会问你说:
"嗨!
你好呀!
你要做些什么事?
"你跟他说:
"我要存钱呀!
",服务员接着就会告诉你:
喝!
那么请前往三号窗口!
那边的人员会帮您服务!
这个时候你总该不会往其它的窗口跑吧?
!
""这些窗口就可以想成是port啰!
所以啦!
每一种服务都有特定的port在监听!
您无须担心计算机会误判的问题呦!
)
·每一个TCP连接都必须由一端(通常为client)发起请求,这个port通常是随机选择大于1024以上(因为0-1023有特殊作用,被预定,如FTP、HTTP、SMTP等)的port号来进行!
其TCP封包会将(且只将)SYN旗标设定起来!
这是整个联机的第一个封包;
·如果另一端(通常为Server)接受这个请求的话(当然啰,特殊的服务需要以特殊的port来进行,例如FTP的port21),则会向请求端送回整个联机的第二个封包!
其上除了SYN旗标之外同时还将ACK旗标也设定起来,并同时在本机端建立资源以待联机之需;
·然后,请求端获得服务端第一个响应封包之后,必须再响应对方一个确认封包,此时封包只带ACK旗标(事实上,后继联机中的所有封包都必须带有ACK旗标);
·只有当服务端收到请求端的确认(ACK)封包(也就是整个联机的第三个封包)之后,两端的联机才能正式建立。
这就是所谓的TCP联机的'三次握手(Three-WayHandshake)'的原理。
经过三向交握之后,呵呵!
你的client端的port通常是高于1024的随机取得的port,至于主机端则视当时的服务是开启哪一个port而定,例如WWW选择80而FTP则以21为正常的联机信道!
总而言之,我们这里所说的端口,不是计算机硬件的I/O端口,而是软件形式上的概念。
根据提供服务类型的不同,端口分为两种,一种是TCP端口,一种是UDP端口。
计算机之间相互通信的时候,分为两种方式:
一种是发送信息以后,可以确认信息是否到达,也就是有应答的方式,这种方式大多采用TCP协议;一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用UDP协议。
对应这两种协议的服务提供的端口,也就分为TCP端口和UDP端口。
那么,如果攻击者使用软件扫描目标计算机,得到目标计算机打开的端口,也就了解了目标计算机提供了哪些服务。
我们都知道,提供服务就一定有服务软件的漏洞,根据这些,攻击者可以达到对目标计算机的初步了解。
如果计算机的端口打开太多,而管理者不知道,那么,有两种情况:
一种是提供了服务而管理者没有注意,比如安装IIS的时候,软件就会自动增加很多服务,而管理员可能没有注意到;一种是服务器被攻击者安装木马,通过特殊的端口进行通信。
这两种情况都是很危险的,说到底,就是管理员不了解服务器提供的服务,减小了系统安全系数。
(扯远了)
端口分类
端口一共有65535个0号是保留端口
1-1024是固定端口,又叫又名端口即被某些程序固定使用,一般程序员不使用
1025-65535是动态端口这些端口是程序员可以使用的
单工、半双工和全双工
1.单工通信(SimplexCommunication)即数据传输只能在一个方向上进行,比如甲可以向乙发送信息,但乙不能向甲发送信息
2.半双工(HalfDuplex)方式:
通信双方设备既是发送器,也是接收器,两台设备可以相互传送数据,但某一时刻则只能向一个方向传送数据。
例如,步话机是半双工设备,因为在一个时刻只能有一方说话。
3.全双工(FullDuplex)方式:
通信双方设备既是发送器,也是接收器,两台设备可以同时在两个方向上传送数据。
例如,电话是全双工设备,因为双方可同时说话。
Javasocket通信示意图
ServerClient
服务端客户端
单工通信只能向服务端发送信息
/*****************************************
Simplex
Server
acceptmessagefromclient
*****************************************/
importjava.io.*;
import.*;
publicclassMyServer{
privateServerSocketss;
privateSocketsocket;
privateBufferedReaderin;
//privatePrintWriterout;
publicstaticvoidmain(Stringargs[]){
newMyServer();
}
publicMyServer(){
try{
ss=newServerSocket(10000);
System.out.println("Listen10000............");
socket=ss.accept();
in=newBufferedReader(newInputStreamReader(socket.getInputStream()));
Stringmassage=in.readLine();
System.out.println("[Client]"+massage);
}catch(Exceptione){
System.out.println(e);
}finally{
try{
if(in!
=null){
in.close();
}
if(socket!
=null){
socket.close();
}
if(ss!
=null){
ss.close();
}
}catch(Exceptione){
System.out.println(e);
}
}
}
}
/***************************************
Simplex
Client
sendmessagetoServer
***************************************/
importjava.io.*;
import.*;
publicclassMyClient{
privateSocketsocket;
privateBufferedReaderin;
privatePrintWriterout;
publicstaticvoidmain(Stringargs[]){
newMyClient();
}
publicMyClient(){
try{
socket=newSocket("127.0.1.1",10000);//"127.0.1.1"yourcomputerIP
in=newBufferedReader(newInputStreamReader(System.in));
Stringmassage=in.readLine();
out=newPrintWriter(socket.getOutputStream(),true);
out.println(massage);
}catch(Exceptione){
System.out.println(e);
}finally{
try{
socket.close();
}catch(Exceptione1){
System.out.println(e1);
}
}
}
}
因为是用手工输入测试中文注释会报错,所以没有用中文,server中的接收数据处理部分一般用循环,为了方便测试,因此此没有用
测试开两个窗口一个客户端一个服务端先打开服务端
半双工
/*******************************************
halfDuplex
Server
acceptmessagefromclient
sendmassagetoclient
********************************************/
importjava.io.*;
import.*;
publicclassMyServer1{
privateServerSocketss;
privateSocketsocket;
privateBufferedReaderin,in1;
privatePrintWriterout;
publicstaticvoidmain(Stringargs[]){
newMyServer1();
}
publicMyServer1(){
try{
ss=newServerSocket(10000);
System.out.println("listening10000");
socket=ss.accept();
System.out.println("link10000");
//acceptMessage
in=newBufferedReader(newInputStreamReader(socket.getInputStream()));
StringacceptMessage=in.readLine();
System.out.println("[Client]"+acceptMessage);
out=newPrintWriter(socket.getOutputStream(),true);
//sendMessage
in1=newBufferedReader(newInputStreamReader(System.in));
StringsendMessage=in1.readLine();
out.println(sendMessage);
}catch(Exceptione){
System.out.println(e);
}finally{
try{
if(in1!
=null){
in1.close();
}
if(in!
=null){
in.close();
}
if(socket!
=null){
socket.close();
}
if(ss!
=null){
ss.close();
}
}catch(Exceptione){
System.out.println(e);
}
}
}
}
/**************************************
halfDuplex
Server
acceptmessagefromserver
sendmassagetoserver
****************************************/
importjava.io.*;
import.*;
publicclassMyClient1{
privateSocketsocket;
privateBufferedReaderin,in1;
privatePrintWriterout;
publicstaticvoidmain(Stringargs[]){
newMyClient1();
}
publicMyClient1(){
try{
socket=newSocket("127.0.1.1",10000);//"127.0.1.1"yourcomputerIP
//sendMessage
in1=newBufferedReader(newInputStreamReader(System.in));
out=newPrintWriter(socket.getOutputStream(),true);
StringsendMessage=in1.readLine();
out.println(sendMessage);
//acceptMessage
in=newBufferedReader(newInputStreamReader(socket.getInputStream()));
StringacceptMessage=in.readLine();
System.out.println("[Server]"+acceptMessage);
}catch(Exceptione){
System.out.println(e);
}finally{
try{
if(in1!
=null){
in1.close();
}
if(in!
=null){
in.close();
}
if(socket!
=null){
socket.close();
}
}catch(Exceptione){
System.out.println(e);
}
}
}
}
客户端向服务器发完信息,只能等待服务端发送,
全双工
/**********************************
Duplex
Server
acceptmessagefromclient
sendmassagetoclient
*********************************/
importjava.io.*;
import.*;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassMyServer3extendsJFrameimplementsActionListener{
JTextAreajta;
JTextFieldjtf;
JButtonjb;
JPaneljpl;
JScrollPanejsp;
BufferedReaderin;
PrintWriterout;
publicstaticvoidmain(Stringargs[]){
newMyServer3();
}
publicMyServer3(){
jta=newJTextArea();
jtf=newJTextField();
jb=newJButton("send");
jb.addActionListener(this);
jpl=newJPanel(newBorderLayout());
jpl.add(jtf,"Center");
jpl.add(jb,"East");
jsp=newJScrollPane(jta);
this.add(jsp,"Center");
this.add(jpl,"South");
this.setTitle("Server");
this.setSize(350,250);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
try{
ServerSocketss=newServerSocket(10000);
Socketsocket=ss.accept();
in=newBufferedReader(newInputStreamReader(socket.getInputStream()));
out=newPrintWriter(socket.getOutputStream(),true);
while(true){
Stringmessage=in.readLine()+"\n";
jta.append("Client:
"+message);
}
}catch(Exceptione){
System.out.println(e);
}finally{
try{
if(out!
=null)out.close();
if(in!
=null)in.close();
}catch(Exceptione){
System.out.println(e);
}
}
}
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==jb){
Stringmessage=jtf.getText();
jta.append("Server:
"+message+"\n");
out.println(message);
jtf.setText("");
}
}
}
/**********************************
Duplex
Server
acceptmessagefromserver
sendmassagetoserver
*********************************/
importjava.io.*;
import.*;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassMyClient3extendsJFrameimplementsActionListener{
JTextAreajta;
JTextFieldjtf;
JButtonjb;
JPaneljpl;
JScrollPanejsp;
BufferedReaderin;
PrintWriterout;
publicstaticvoidmain(Stringargs[]){
newMyClient3();
}
publicMyClient3(){
jta=newJTextArea();
jtf=newJTextField();
jb=newJButton("send");
jb.addActionListener(this);
jpl=newJPanel(newBorderLayout());
jpl.add(jtf,"Center");
jpl.add(jb,"East");
jsp=newJScrollPane(jta);
this.add(jsp,"Center");
this.add(jpl,"South");
this.setTitle("Client");
this.setSize(350,250);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
try{
Socketsocket=newSocket("127.0.1.1",10000);
in=newBufferedReader(newInputStreamReader(socket.getInputStream()));
out=newPrintWriter(socket.getOutputStream(),true);
while(true){
Stringmessage=in.readLine()+"\n";
jta.append("Server:
"+message);
}
}catch(Exceptione){
System.out.println(e);
}finally{
try{
if(out!
=null)out.close();
i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 JavaSocket 网络 编程 山寨 QQ