Socket的连接创建
代码往下调试进入ConnectionImp下的createNewIO()方法
public synchronized void createNewIO(boolean isForReconnect)
throws SQLException {
Properties mergedProps = exposeAsProperties(this.props);
if (!getHighAvailability()) {
//进入该方法
connectOneTryOnly(isForReconnect, mergedProps);
return;
}
//???
connectWithRetries(isForReconnect, mergedProps);
}
private void connectOneTryOnly(boolean isForReconnect,
Properties mergedProps) throws SQLException {
Exception connectionNotEstablishedBecause = null;
try {
//IO创建主要在这个方法里
coreConnect(mergedProps);
this.connectionId = this.io.getThreadId();
this.isClosed = false;
// save state from old connection
boolean oldAutoCommit = getAutoCommit();
int oldIsolationLevel = this.isolationLevel;
boolean oldReadOnly = isReadOnly();
String oldCatalog = getCatalog();
this.io.setStatementInterceptors(this.statementInterceptors);
// Server properties might be different
// from previous connection, so initialize
// again...
initializePropsFromServer();
if (isForReconnect) {
// Restore state from old connection
setAutoCommit(oldAutoCommit);
if (this.hasIsolationLevels) {
setTransactionIsolation(oldIsolationLevel);
}
setCatalog(oldCatalog);
setReadOnly(oldReadOnly);
}
return;
} catch (Exception EEE) {
if (this.io != null) {
this.io.forceClose();
}
connectionNotEstablishedBecause = EEE;
if (EEE instanceof SQLException) {
throw (SQLException)EEE;
}
SQLException chainedEx = SQLError.createSQLException(
Messages.getString("Connection.UnableToConnect"),
SQLError.SQL_STATE_UNABLE_TO_CONNECT_TO_DATASOURCE, getExceptionInterceptor());
chainedEx.initCause(connectionNotEstablishedBecause);
throw chainedEx;
}
}
进入coreconnect()方法
private void coreConnect(Properties mergedProps) throws SQLException,
IOException {
int newPort = 3306;
String newHost = "localhost";
String protocol = mergedProps.getProperty(NonRegisteringDriver.PROTOCOL_PROPERTY_KEY);
if (protocol != null) {
// "new" style URL
if ("tcp".equalsIgnoreCase(protocol)) {
newHost = normalizeHost(mergedProps.getProperty(NonRegisteringDriver.HOST_PROPERTY_KEY));
newPort = parsePortNumber(mergedProps.getProperty(NonRegisteringDriver.PORT_PROPERTY_KEY, "3306"));
} else if ("pipe".equalsIgnoreCase(protocol)) {
setSocketFactoryClassName(NamedPipeSocketFactory.class.getName());
String path = mergedProps.getProperty(NonRegisteringDriver.PATH_PROPERTY_KEY);
if (path != null) {
mergedProps.setProperty(NamedPipeSocketFactory.NAMED_PIPE_PROP_NAME, path);
}
} else {
// normalize for all unknown protocols
newHost = normalizeHost(mergedProps.getProperty(NonRegisteringDriver.HOST_PROPERTY_KEY));
newPort = parsePortNumber(mergedProps.getProperty(NonRegisteringDriver.PORT_PROPERTY_KEY, "3306"));
}
} else {
String[] parsedHostPortPair = NonRegisteringDriver
.parseHostPortPair(this.hostPortPair);
newHost = parsedHostPortPair[NonRegisteringDriver.HOST_NAME_INDEX];
newHost = normalizeHost(newHost);
if (parsedHostPortPair[NonRegisteringDriver.PORT_NUMBER_INDEX] != null) {
newPort = parsePortNumber(parsedHostPortPair[NonRegisteringDriver.PORT_NUMBER_INDEX]);
}
}
this.port = newPort;
this.host = newHost;
//MysqlIO的创建,用来于服务器进行通信
this.io = new MysqlIO(newHost, newPort,
mergedProps, getSocketFactoryClassName(),
getProxy(), getSocketTimeout(),
this.largeRowSizeThreshold.getValueAsInt());
this.io.doHandshake(this.user, this.password,
this.database);
}
MysqlIO构造器的创建
public MysqlIO(String host, int port, Properties props,
String socketFactoryClassName, MySQLConnection conn,
int socketTimeout, int useBufferRowSizeThreshold) throws IOException, SQLException {
this.connection = conn;
if (this.connection.getEnablePacketDebug()) {
this.packetDebugRingBuffer = new LinkedList();
}
this.traceProtocol = this.connection.getTraceProtocol();
this.useAutoSlowLog = this.connection.getAutoSlowLog();
this.useBufferRowSizeThreshold = useBufferRowSizeThreshold;
this.useDirectRowUnpack = this.connection.getUseDirectRowUnpack();
this.logSlowQueries = this.connection.getLogSlowQueries();
this.reusablePacket = new Buffer(INITIAL_PACKET_SIZE);
this.sendPacket = new Buffer(INITIAL_PACKET_SIZE);
this.port = port;
this.host = host;
this.socketFactoryClassName = socketFactoryClassName;
this.socketFactory = createSocketFactory();
this.exceptionInterceptor = this.connection.getExceptionInterceptor();
try {//创建得到一个socket
this.mysqlConnection = this.socketFactory.connect(this.host,
this.port, props);
if (socketTimeout != 0) {
try {
this.mysqlConnection.setSoTimeout(socketTimeout);
} catch (Exception ex) {
/* Ignore if the platform does not support it */
}
}
this.mysqlConnection = this.socketFactory.beforeHandshake();
if (this.connection.getUseReadAheadInput()) {
//创建input流
this.mysqlInput = new ReadAheadInputStream(this.mysqlConnection.getInputStream(), 16384,
this.connection.getTraceProtocol(),
this.connection.getLog());
} else if (this.connection.useUnbufferedInput()) {
this.mysqlInput = this.mysqlConnection.getInputStream();
} else {
this.mysqlInput = new BufferedInputStream(this.mysqlConnection.getInputStream(),
16384);
}
//创建output流
this.mysqlOutput = new BufferedOutputStream(this.mysqlConnection.getOutputStream(),
16384);
this.isInteractiveClient = this.connection.getInteractiveClient();
this.profileSql = this.connection.getProfileSql();
this.autoGenerateTestcaseScript = this.connection.getAutoGenerateTestcaseScript();
this.needToGrabQueryFromPacket = (this.profileSql ||
this.logSlowQueries ||
this.autoGenerateTestcaseScript);
if (this.connection.getUseNanosForElapsedTime()
&& Util.nanoTimeAvailable()) {
this.useNanosForElapsedTime = true;
this.queryTimingUnits = Messages.getString("Nanoseconds");
} else {
this.queryTimingUnits = Messages.getString("Milliseconds");
}
if (this.connection.getLogSlowQueries()) {
calculateSlowQueryThreshold();
}
} catch (IOException ioEx) {
throw SQLError.createCommunicationsException(this.connection, 0, 0, ioEx, getExceptionInterceptor());
}
}
分享到:
相关推荐
在“mysql-driver:mysql jdbc驱动源码阅读”这个主题中,我们将深入探讨该驱动的工作原理、关键组件以及源码分析。 1. **JDBC驱动类型**: JDBC驱动分为四种类型:Type 1、Type 2、Type 3 和 Type 4。MySQL ...
在聊天室中,服务器端创建ServerSocket,监听指定端口,当有客户端通过Socket连接时,服务器端会创建一个新的Socket对象来处理这个连接。客户端也会创建一个Socket连接到服务器,通过这两个Socket对象,数据可以在...
7. **数据库集成**:为了存储用户信息、聊天记录等,源码可能会连接到数据库,如MySQL或MongoDB。这涉及到JDBC(Java Database Connectivity)或其他ORM框架,如Hibernate或MyBatis,用于在Java应用程序和数据库之间...
开发者需要加载MySQL的JDBC驱动,然后使用DriverManager.getConnection()方法建立到MySQL服务器的连接。接着,可以通过Statement或PreparedStatement对象执行SQL查询和操作。 描述中的“支持转送个人基本信息”表明...
Java提供了多种数据库API,如JDBC(Java Database Connectivity),用于连接和操作关系型数据库,如MySQL或Oracle。 7. **事件驱动编程**:在GUI编程中,事件驱动编程是常见的模式。用户界面中的按钮点击、文本输入...
这部分内容可能涵盖SQL查询、JDBC驱动的使用等。 7. **安全与加密**:为了保护用户隐私,聊天软件可能会实现消息的加密传输。Java提供了诸如SSL/TLS等安全套接层,源码中可能包含相关实现。 8. **事件监听与处理**...
- JDBC驱动的加载与连接数据库; - SQL语句的编写与执行; - ResultSet的解析与数据展示。 #### 六、学习资源 - **视频教程**:提供详细的开发步骤讲解,帮助理解整个项目的构建过程。 - **源代码**:通过分析源...
如果是数据库,可能采用的是JDBC(Java Database Connectivity)来连接并操作数据库,例如MySQL或SQLite。 5. **对象序列化与反序列化**:在网络通信中,Java的`java.io.Serializable`接口可以用来序列化对象,将其...
在Java开发中,这通常涉及到数据库操作,如使用JDBC(Java Database Connectivity)连接到MySQL或其他关系型数据库,存储和验证用户信息。用户注册时,需要收集用户名、密码(通常会加密存储)和其他必要信息。登录...
程序可能使用JDBC(Java Database Connectivity)来连接和操作数据库,如MySQL或Oracle。 10. **异常处理**:为了确保程序的健壮性,开发者会在关键部分添加异常处理代码,捕获并处理可能出现的错误情况,如网络...
Java提供了JDBC(Java Database Connectivity)API来连接和操作各种类型的数据库,如MySQL、Oracle等。 8. **安全性**:为了保证聊天室的安全性,可能需要实现用户认证和授权机制,例如用户名和密码的验证,防止...
数据库操作也可能涉及,如果iCHAT聊天室保存聊天记录,那么可能使用了JDBC(Java Database Connectivity)来与MySQL、Oracle等数据库进行交互,实现数据的持久化存储。 总的来说,"java源码:iCHAT聊天室基于Java....
这需要数据库的支持,如使用JDBC操作MySQL等数据库。 6. **GUI设计**:为了让用户界面友好,聊天室通常会使用图形用户界面(GUI)。Java的Swing或JavaFX库可以用来创建用户界面,如按钮、文本框、聊天窗口等。 7. ...
- Java提供了Socket编程接口,允许开发者创建客户端和服务器端的连接,这是构建即时通信系统的基础。 - Java NIO(非阻塞I/O)可以提高系统的并发性能,尤其是在处理大量连接时。 2. **多线程技术** - 即时通信...
5. **源码分析**:王冲海的JAVA聊天系统源码可能包含了模块化的代码结构,包括用户登录模块、聊天模块、文件传输模块等,每个模块都有明确的功能划分,方便理解和维护。 6. **资源管理**:系统可能涉及到了资源文件...
- **数据库操作**:SQL语句的编写,以及如何使用JDBC进行数据库连接和操作。 这个项目对初学者来说是一个很好的实践平台,可以帮助他们将理论知识转化为实际项目经验。对于有经验的开发者,它也是一个研究和借鉴的...
- Java源码可能包含多个模块,如数据库连接、网络通信、游戏逻辑处理、安全性控制等。 3. **网络通信** - 使用Java的Socket编程实现TCP/IP协议,用于可靠的数据传输。服务端接收客户端的请求,解析数据并作出响应...
Java版飞信客户端源码分析 飞信是中国移动推出的一款即时通讯软件,它允许用户通过互联网或移动网络进行免费的短信、语音通话等通信服务。本文将深入探讨Java版飞信客户端的源码,帮助开发者了解其内部工作原理,...
1. **Java网络编程**:iCHAT的核心功能是实现用户间的实时通信,这需要使用Java的Socket编程,创建TCP或UDP连接,以便数据的可靠传输。 2. **多线程处理**:为了处理多个并发连接,Java的多线程技术是必不可少的。...
摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程...