\chapter{使用Python进行Socket通讯}
让我们开始使用Python创建第一个通信应用程序。

\section{一个简单的程序}

\subsection{服务器.py}
\lstinputlisting[language=Python]{data/codes/3/1server.py}

\subsection{客户端.py}
\lstinputlisting[language=Python]{data/codes/3/1client.py}

从上面的代码中，我们可以知道，如果要创建通信，则需要创建一个服务器，该服务器首先侦听带有端口的IP地址，然后创建一个连接到确切IP地址和端口的客户端。


\section{有关进程阻塞的问题}
我们在这里遇到的问题是服务器将尝试永远运行，而不会自行停止。 它将保持接受连接，并向所有想要连接的客户端发送“Thank you for connection”字符串。

在这种情况下，您只能预定义该通信处理。 假设客户发送给您“How are you?”，您回答“I'm fine.”。

这并不酷，尤其是当您想与某人实时聊天时。 因为在聊天时，必须有双向的信息流，一个人不仅需要发送消息，还必须从其他人那里接收消息。

\subsection{线程}
定义：在计算机科学中，\textbf{线程}是可以由调度程序（通常是操作系统的一部分）独立管理的最小化编程指令序列。

\subsubsection{简单的例子}
\lstinputlisting[language=Python]{data/codes/3/3thread_example.py}

\noindent 
输出是：

\begin{lstlisting}
22:16:00: Main    : before creating thread
22:16:00: Main    : before running thread
22:16:00: Thread: starting yeah!
22:16:00: Main    : wait for the thread to finish
22:16:00: Main    : all done
22:16:02: Thread: finishing yeah!
\end{lstlisting}

线程程序可以与主进程分开运行。 我们可以使用此功能来创建能够进行双向通信的节点。

\subsubsection{把它加到服务器.py}
\lstinputlisting[language=Python]{data/codes/3/2server.py}

\subsubsection{把它加到客户端.py}
\lstinputlisting[language=Python]{data/codes/3/2client.py}

\subsubsection{总结}
于是我们就这么愉快地实现了双向通信。发信者可以随时随地发送消息，接收者也可以随时随地发送消息，并且，在任何时候任何一方接收到了新消息，程序都会在屏幕上打印出来。

\subsection{多进程}
线程不安全。 任何资深程序员都会同意这一点。

这就是为什么我们需要一种更安全的编程技术来实现相同的目的：多进程。

\textbf{多进程}是在单个计算机系统中使用两个或多个中央处理单元。

该术语还指系统支持多个处理器或能分配任务给多个处理器。

有了多进程技术，我们同样可以在一个程序里运行两段独立的运算。

\subsubsection{一个简单的例子}
\lstinputlisting[language=Python]{data/codes/3/3multiprocessing_example.py}

\noindent 
The result is:

\begin{lstlisting}
3 to the power of 2 is: 
9
\end{lstlisting}

\subsubsection{把它加到服务器.py}
\lstinputlisting[language=Python]{data/codes/3/4server.py}

\subsubsection{把它加到客户端.py}
\lstinputlisting[language=Python]{data/codes/3/4client.py}

\subsubsection{总结}
使用多进程的好处就是它更加稳定，因为不同的进程可以由不同的处理器处理。