一. 简单介绍下Socket的用途:
1.Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相关的技术
2.IP地址+端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础
3.Socket套接字:网络上具有唯一标识的IP地址和端口组合在一起才能构成唯一能识别的标识符套接字。
Socket原理机制:
通信的两端都有Socket
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输
注:需要导一些jar包
新建一个日志文件
项目整体架构
二.下面上代码:
1.服务端
package socket_work;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Logger;
import util.Log4jBean;
/**
* 服务端
* @author syp
*
*/
public class Server2 extends Thread {
public void run() {
for(int i=0;i<3;i++) {
try {
this.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
Log4jBean.logger.info("服务器正在启动,请稍后。。。");
Server2 s=new Server2();
s.run();
//创建一个服务器端socket,指定绑定的端口号,并监听此端口
ServerSocket serverSocket = new ServerSocket(8080);
//调用accept()方法开始监听,等待客户端的连接
Log4jBean.logger.info("=====================================================");
Log4jBean.logger.info("============服务器已启动,等待客户端的连接===============");
Log4jBean.logger.info("=====================================================");
Socket socket = serverSocket.accept();
//获取输入流,并读取客户端信息
InputStream inp = socket.getInputStream();
//把字节流转换成字符流
InputStreamReader isr = new InputStreamReader(inp);
//为字符流增加缓冲区
BufferedReader bfr = new BufferedReader(isr);
String clientinfo = null;
int i=0;
while((clientinfo=bfr.readLine())!=null){//循环读取数据
System.out.println("此处为服务器 \n "
+ " 正在获取客户端对话 \n"
+ " 客户端请求信息为"+clientinfo);
String[ ] strs = clientinfo.split(";");
}
socket.shutdownInput();//关闭输入流
//向客户端传递的信息
OutputStream ots = socket.getOutputStream();
PrintWriter pw = new PrintWriter(ots);
pw.write("==================欢迎登陆=====================");
pw.flush();
//关闭资源
Log4jBean.logger.info("准备关闭资源");
pw.close();
ots.close();
bfr.close();
isr.close();
inp.close();
socket.close();
serverSocket.close();
}
}
2.客户端
package socket_work;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import util.Log4jBean;
/**
* 客户端
* @author syp
*
*/
public class Client {
public static void main(String[] args) {
try {
//创建一个客户端socket,
Socket socket = new Socket("localhost",8080);
//向服务器端传递信息
OutputStream ots = socket.getOutputStream();
PrintWriter pw = new PrintWriter(ots);
Scanner input=new Scanner(System.in);
Log4jBean.logger.info("==============================================================");
Log4jBean.logger.info("===================欢迎进入登陆界面=============================");
Log4jBean.logger.info("==============================================================");
Log4jBean.logger.info("请输入您的用户名");
String username=input.nextLine();
Log4jBean.logger.info("请输入密码");
String password=input.nextLine();
pw.write(username+";"+password);
pw.flush();
Log4jBean.logger.info("开始关闭输出流");
//关闭输出流
socket.shutdownOutput();
//获取服务器端传递的数据
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String info = null;
while((info=br.readLine())!=null){
Log4jBean.logger.info(" 此处为客户端 \n"
+ " 正在等待服务器响应 \n"
+ " 服务器响应:"+info+" ");
}
//关闭资源
Log4jBean.logger.info("准备关闭资源");
br.close();
isr.close();
is.close();
pw.close();
ots.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.其中需要的一些工具类,如日志打印类及日志的配置文件
①.新建一个Log4jBean日志类
package util;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4jBean {
public static Logger logger = LogManager.getLogger(Log4jBean.class
.getName());
}
②.新建日志配置文件log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<properties>
<property name="logPath">log</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%F]-[%p]-%L %m%n " />
</Console>
<RollingFile name="RollingFile" filename="${logPath}/log.log"
filepattern="${logPath}/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%F]-[%p]-%L %m%n " />
<Policies>
<SizeBasedTriggeringPolicy size="10240kb"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console" />
<!-- <AppenderRef ref="LogFile" /> -->
<AppenderRef ref="RollingFile" />
</Root>
</Loggers>
</Configuration>