1、什么是TCP传输协议:
2、什么是Socket:
3、实现客户端与服务器的通信
(1)、控制台版
先看代码:
(注意:此代码可以直接复制粘贴但是需要将包名换成自己写的。)
编写服务器Socket:
package test08;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ServerSocket s = null;
try
{
s = new ServerSocket(6666);//创建端口
Socket s1 = s.accept();
System.out.println("this is a Server Window:");
OutputStream os = s1.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF("Server : Hello,my name is Server!");
InputStream is = s1.getInputStream();
DataInputStream dis = new DataInputStream(is);
System.out.println(dis.readUTF());
dos.close();
s1.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
编写客户端的Socket:
package test08;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
try
{
Socket s1 = new Socket("10.3.63.213",6666);
System.out.println("this is a Client Window:");
InputStream is = s1.getInputStream();
DataInputStream dis = new DataInputStream(is);
OutputStream os = s1.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF("Client : Hello, my name is client");
System.out.println(dis.readUTF());
dis.close();
s1.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
运行结果:
(注意:运行时要注意程序启动顺序,先运行服务器类,再运行客户端类。)
服务器类控制台输出显示:
客户端类控制台输出显示:
再看原理:
1、实现过程:
通过tcp协议和ServerSocket类我们能实现一个简单的客户端与服务器的通信过程,在服务器类与客户端类中有一段长相相同四句的代码:
InputStream is = s1.getInputStream();
DataInputStream dis = new DataInputStream(is);
OutputStream os = s1.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
他们就是连接服务器端与客户端的桥梁。
也就是说,客户端与服务器端是通过输入输出流进行相互连接的。
如图:
服务器的输出由客户端的输入接收到传递给客户端,客户端的输出再由服务器的输入接收到传递给服务器端。主要实现的方法就是getInputStream()和getOutputStream();其中DataOutputStream()和DataInputStream()是实现数据流通的方法。
而writeUTF()方法可以使输入的信息以UTF形式编码方式写入,readUTF()方法是使被输入的信息以UTF编码形式读出。
2、 客户端的套接字对象的实现:
try{Socket mysocket = new Scoket(“你的客户端的IP地址”,要连接的服务器端口名)};
catch(IOException e){ };
如果不知道在哪查看自己的IP地址的小伙伴可以采用以下方法:
1、点击桌面WiFi信号图标,选择已连接的网络,点击属性查看ipv4,把后面的一串数据输入就可以了。
2、快捷键win+r打开运行窗口输入cmd,在输入ipconfig,点击回车找到ipv4输入即可。
3、服务器的套接字对象实现:
try{ServerSocekt server_socket = new ServerSocket(端口名);
}
catch(IOException e) { }
注意端口名不要使用0~1023间的数,他们是被预先定义的服务通信占用的,如telnet占用端口23,http占用80等。
try{Socket sc = new server_socket.accept();
}
catch(IOException e) { }
以下是一个改进版本,加入一个while()循环 ,实现多对话聊天。
Server类:
package test08;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ServerSocket s = null;
try
{
s = new ServerSocket(8888);//创建服务器端口
System.out.println("服务器窗口:");//在控制台输出端口名
Socket s1 = s.accept();//等待接收
OutputStream os = s1.getOutputStream();//创建输出流向客户端发送信息
DataOutputStream dos = new DataOutputStream(os);//将数据输出给客户端
InputStream is = s1.getInputStream();//创建输入流接收客户端发来的数据
DataInputStream dis = new DataInputStream(is);//将客户端发来的数据传入服务器
Scanner input = new Scanner(System.in);//控制台输入信息
while(true)
{
String s2 = input.nextLine();//键盘输入指令
dos.writeUTF(s2);//输出给客户端
// dos.flush();
if(s2.equals("over")) break;
System.out.println(dis.readUTF());
}
dos.close();
s1.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
Client类:
package test08;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Socket s1 = new Socket("10.3.63.213",8888);//创建客户端,设置ip和服务器端口
System.out.println("客户端窗口:");//给客户端命名
InputStream is = s1.getInputStream();//创建输入流连接服务器服务器
DataInputStream dis = new DataInputStream(is);//获得输入数据
OutputStream os = s1.getOutputStream();//创建输出流连接服务器
DataOutputStream dos = new DataOutputStream(os);//获得输出数据
Scanner input = new Scanner(System.in);//引入键盘类
while(true)
{
String s2 = input.nextLine();
dos.writeUTF(s2);
// dos.flush();
if(s2.equals("over")) break;
System.out.println(dis.readUTF());
}
dos.close();
s1.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
运行结果:
(此方法并不是很好,需要按回车才能显示收到的信息。)