①实现登录,验证密码账户是否正确(先启动服务端,再启动客户端)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 客户端发送账号、密码,服务端判断是否正确,并返回状态码
* @author littledyf
*
*/
public class Server {
public static void main(String[] args) throws Exception {
//1.建立服务器,设置端口,等待客户端连接
ServerSocket server = new ServerSocket(8888);
System.out.println("服务端已启动,等待客户端连接~~");
Socket socket = server.accept();
//4.接收客户端发送过来的信息
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String username = br.readLine();
String password = br.readLine();
//5.判断用户名和密码是否正确,设置状态码
String info = "";
if("dyf".equals(username)){
if("123456".equals(password)){
//用户名和密码正确
info = "1";
}else{
//密码错误
info = "2";
}
}else{
//无此用户
info = "3";
}
//6.向客户端返回信息
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println(info);
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception {
//2.建立socket,设置服务端ip地址和需要连接的端口
Socket socket = new Socket("127.0.0.1",8888);
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = input.next();
System.out.println("请输入密码:");
String password = input.next();
//3.向服务端发送信息
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println(username);
ps.println(password);
//7.接收服务端返回来的状态码,显示信息
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String readline = br.readLine();
if("1".equals(readline)){
System.out.println("登录成功!");
}else if("2".equals(readline)){
System.out.println("密码错误!");
}else if("3".equals(readline)){
System.out.println("没有此用户!");
}else{
System.out.println("服务端出错,请稍后再试!");
}
}
}
②一对一通信(只能实现一人说一句)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ServerOBO {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(8888);
System.out.println("服务端已启动,等待客户端连接~~");
Socket socket = server.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream());
Scanner input = new Scanner(System.in);
while(true){
//服务端接收消息
String readline = br.readLine();
System.out.println(readline);
//服务端向客户端发送消息
ps.println("我是服务端:" + input.next());
}
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class ClientOBO {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost",8888);
System.out.println("已连接服务端,可以进行通信~~");
PrintStream ps = new PrintStream(socket.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Scanner input = new Scanner(System.in);
while(true){
//客户端向服务端发送消息
ps.println("客户端说:" + input.next());
//接收服务端发送的信息
String readline = br.readLine();
System.out.println(readline);
}
}
}
③一对一通信的优化(能实现一人说多句,思路就是将接收消息做成一个线程,由服务端和客户端去启动线程)
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* 一对一聊天优化
* @author littledyf
*
*/
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(8888);
System.out.println("服务端已启动,等待客户端连接~~");
Socket socket = server.accept();
System.out.println("客户端已连接~~");
Scanner input = new Scanner(System.in);
new ReceiveThread(socket).start();
PrintStream ps = new PrintStream(socket.getOutputStream());
while(true){
ps.println("我是服务端:" + input.next());
}
}
}
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost",8888);
System.out.println("已连接服务端,可以开始聊天~~");
Scanner input = new Scanner(System.in);
PrintStream ps = new PrintStream(socket.getOutputStream());
new ReceiveThread(socket).start();
while(true){
ps.println("我是客户端:" + input.next());
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class ReceiveThread extends Thread{
private BufferedReader br;
public ReceiveThread(Socket socket){
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
String readline;
try {
readline = br.readLine();
System.out.println(readline);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
④群聊的实现(实现思路是为服务端写一个线程,去处理接收到的消息,并转发,转发的条件是不是此客户端发送的信息,转发给其它客户端)
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
public class Server {
public static HashMap<String, Socket> map = new HashMap<String, Socket>();
@SuppressWarnings({ "resource" })
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(8888);
while(true){
Socket socket = server.accept();
String ip = socket.getInetAddress().getHostAddress();
map.put(ip, socket);
new ServerThread(ip,socket).start();
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.HashMap;
import java.util.Set;
import java.util.Map.Entry;
public class ServerThread extends Thread{
private String ip;
private BufferedReader br;
public ServerThread(String ip, Socket socket) throws Exception {
this.ip = ip;
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try {
String readline = br.readLine();
System.out.println(readline);
HashMap<String, Socket> map = Server.map;
Set<Entry<String, Socket>> entrySet = map.entrySet();
for (Entry<String, Socket> entry : entrySet) {
String key = entry.getKey();
Socket value = entry.getValue();
if(!key.equals(ip)){
PrintStream ps = new PrintStream(value.getOutputStream());
ps.println(readline);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost",8888);
Scanner input = new Scanner(System.in);
PrintStream ps = new PrintStream(socket.getOutputStream());
new ReceiveThred(socket).start();
while(true){
ps.println("我是客户端:" + input.next());
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class ReceiveThred extends Thread{
private BufferedReader br;
public ReceiveThred(Socket socket){
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
String reandeline;
try {
reandeline = br.readLine();
System.out.println(reandeline);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}