一,用程序的方式,实现两个人相互打电话的过程。,听到有一方说拜拜就挂机。
Scoket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求
在 java中Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端
Socket是建立网络连接时使用的,在连接成功时,应用程序两端都会产生一个Socket实例
操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别
不因为在服务器端或在客户端而产生不同的级别,不管是Socket还是ServerSocket他们的
工作都是通过Socket类和其子类来完成的
建立Socket链接可分三个步骤:
1.服务器监听
2.客户端发出请求
3.建立链接
4.通信
服务器代码:
package 网络编程;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
//服务器
public class Server {
public static void main(String[] args) throws IOException {
//创建服务器对象
ServerSocket server=new ServerSocket(8888);
System.out.println("服务器开机。。");
//等待客户接入,此时如果没有客户接入,流程就在此阻塞
Socket client=server.accept();
System.out.println("有朋自远方来,不亦乐乎!!");
//通信,起点是服务器,终点是客户端
OutputStream out=client.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(out);
BufferedWriter bw=new BufferedWriter(osw);
//接收信息
InputStream in=client.getInputStream();
InputStreamReader isr=new InputStreamReader(in);
BufferedReader br=new BufferedReader(isr);
Scanner s=new Scanner(System.in);
//输入信息
while(true){
System.out.println("服务器请说话。。");
String msg=null;
msg=s.nextLine();//只以回车作为结束
bw.write(msg);
bw.newLine();
bw.flush();
if(msg.equals("拜拜")){
break;
}
msg=br.readLine();
System.out.println(msg);
if(msg.equals("拜拜")){
break;
}
}
}
}
客户端代码:
package 网络编程;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
//客户端
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket server=new Socket("127.0.0.1",8888);//本地,端口号8888
System.out.println("链接上了服务器");
//起点是服务器,终点是客户端
InputStream in=server.getInputStream();
InputStreamReader isr=new InputStreamReader(in);
BufferedReader br=new BufferedReader(isr);
OutputStream out=server.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(out);
BufferedWriter bw=new BufferedWriter(osw);
Scanner s=new Scanner(System.in);
while(true){
String msg=null;
msg=br.readLine();
System.out.println(msg);
System.out.println("客户端请说话。。");
if(msg.equals("拜拜")){
break;
}
msg=s.nextLine();
bw.write(msg);
bw.newLine();
bw.flush();
if(msg.equals("拜拜")){
break;
}
}
}
}
二,服务器把客户端说的话往回转发
和上面差不多,只是服务器不再输入了,而是直接转发客户端发来的消息而已
服务器代码:
package 网络编程;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) throws IOException {
//服务器代码
ServerSocket server=new ServerSocket(8888); //创建服务器
System.out.println("服务器开机");
Socket client=server.accept();
//服务器给客户端发消息
OutputStream os=client.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os);
BufferedWriter bw=new BufferedWriter(osw);
//服务器接收客户端的消息
InputStream is=client.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
System.out.println("服务器链接上了");
while(true){
String s=null;
s=br.readLine();
bw.write(s);
bw.newLine();
bw.flush();
if(s.equals("拜拜")){
break;
}
}
}
}
客户端代码:
package 网络编程;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket server=new Socket("127.0.0.1",8888);
System.out.println("链接上了服务器");
//客户端给服务器发消息
OutputStream os=server.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os);
BufferedWriter bw=new BufferedWriter(osw);
//客户端接收服务器的消息
InputStream is=server.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
Scanner sc=new Scanner(System.in);
while(true){
String s=null;
s=sc.nextLine();
bw.write(s);
bw.newLine();
bw.flush();
if(s.equals("拜拜")){
break;
}
s=br.readLine();
System.out.println(s);
}
}
}
三,做一个群聊模拟
既然是群聊,就是所有人都可以抢着说话,不能等一个人说完在让其他人说,所以客户端是一个多线程状态。服务器不能等转发完一个人的消息再转发其他人的,不能让其他人的消息排队等着,所以服务器也是一个多线程的。
服务器代码:
package 网络编程;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
//**********************************************************************
class S implements Runnable{
private Socket client;
public S(Socket client){
this.client=client;
}
//任务,服务器处理用户的请求
public void run() {
try {
//通信,起点是服务器,终点是客户端
OutputStream out=null;
InputStream in=client.getInputStream();
InputStreamReader isr=new InputStreamReader(in);
BufferedReader br=new BufferedReader(isr);
while(true){
String msg=null;
msg=br.readLine();
//开始广播
for (int i = 0; i <Server.list.size(); i++) {
Socket client=Server.list.get(i); //放到集合里面
out=client.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(out);
BufferedWriter bw=new BufferedWriter(osw);
bw.write(msg);
bw.newLine();
bw.flush();
if(msg.equals("拜拜")){
break;
}
}
}
} catch (Exception e) {
}
}
}
//**************************************************************************
//服务器
public class Server {
public static List<Socket> list=new ArrayList<Socket>();
public static void main(String[] args) throws IOException {
//创建服务器对象
ServerSocket server=new ServerSocket(8888);
System.out.println("服务器开机。。");
while(true){
//等待客户接入,此时如果没有客户接入,流程就在此阻塞
Socket client=server.accept();//来一个接受一个
System.out.println("有朋自远方来,不亦乐乎!!");
S s=new S(client);
Thread t=new Thread(s);
t.start();
list.add(client);
}
}
}
客户端代码:
package 网络编程;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
//********************************************************************************
class C implements Runnable{
Socket server;
public C(Socket server){
this.server=server;
}
//任务,时刻保持接收信息
public void run() {
while(true){
try {
InputStream in=server.getInputStream();
InputStreamReader isr=new InputStreamReader(in);
BufferedReader br=new BufferedReader(isr);
String msg=null;
msg=br.readLine();
System.out.println(msg);
} catch (Exception e) {
}
}
}
}
//客户端
//***********************************************************************************
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket server=new Socket("127.0.0.1",8888);
System.out.println("链接上了服务器");
//起点是服务器,终点是客户端
C c=new C(server);
Thread t=new Thread(c);
t.start();
OutputStream out=server.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(out);
BufferedWriter bw=new BufferedWriter(osw);
Scanner s=new Scanner(System.in);
Scanner sn=new Scanner(System.in);
System.out.println("请输入你的名字");
String name=sn.nextLine();
while(true){
String msg=null;
msg=s.nextLine();
bw.write(name+":"+msg);
bw.newLine();
bw.flush();
if(msg.equals("拜拜")){
break;
}
}
}
}