服务端:(要记得写端口号,我一开始就忘了写/(ㄒoㄒ)/~~)
package Test;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
* @author lenovo
*
*/
public class NineteenSever {
public static void main(String[] args) {
try {
ServerSocket ss=new ServerSocket(8005);
while(!ss.isClosed()){
Socket s=ss.accept();
OutputStream ops = s.getOutputStream();
String str = "欢迎进入程序\n编写TCP服务器程序,"
+ "实现创建一个在8001端口上等待的ServerSocket"
+ "对象,当接收到一个客户机的连接请求后,"
+ "程序从与客户机建立了连接的Socket对象中获得输入输出"
+ "流。通过输出流向客户机发送信息。";
ops.write(str.getBytes());//将字符串变成byte数组写入
ops.close();
s.close();
}
ss.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
package Test;
import java.awt.BorderLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
* 客户端
* @author lenovo
*
*/
public class NineteenClient extends JFrame {
private JTextArea textArea;
private JTextField portField;
private JTextField hostField;
public static void main(String[] args) {
NineteenClient n=new NineteenClient();
n.setVisible(true);
}
public NineteenClient(){
setBounds(100 ,100,500,120);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel panel=new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
getContentPane().add(panel,BorderLayout.NORTH);
final Label label=new Label();
label.setText("连接主机:");
panel.add(label);
hostField=new JTextField();
hostField.setText("localhost");
panel.add(hostField);
final Label label2=new Label();
label2.setText("连接端口:");
panel.add(label2);
portField=new JTextField();
portField.setText("8005");
panel.add(portField);
JButton button=new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String hostName=hostField.getText();
String portNum=portField.getText();
int port=Integer.parseInt(portNum);
try {
InetAddress host=InetAddress.getByName(hostName);//实例化对应主机的InetAddress对象
Socket socket=new Socket(host,port);//实例化socket
InputStream is=socket.getInputStream();
InputStreamReader reader=new InputStreamReader(is);
int data=0;
while((data=reader.read())!=-1){
textArea.append((char)data+"");
}
} catch (Exception e1) {
// TODO Auto-generated catch block
textArea.append(e1.toString());
e1.printStackTrace();
}
}
});
button.setText("连接");
panel.add(button);
final JScrollPane pane=new JScrollPane();
getContentPane().add(pane,BorderLayout.CENTER);
textArea=new JTextArea();
textArea.setLineWrap(true);
pane.setViewportView(textArea);
}
}
补充知识点:
第一个:BoxLayout(箱式布局):
箱式布局管理器。它把若干组件按水平或垂直方向依次排列放置。Swing 提供了一个实现了 BoxLayout 的容器组件Box。使用 Box 提供的静态方法,可快速创建水平/垂直箱容器(Box),以及填充组件之间空隙的不可见组件。用水平箱和垂直箱的组合嵌套可实现类似于 GridBagLayout 的效果,但没那么复杂。这是通过参数 X_AXIS、Y_AXIS 来决定的。X_AXIS 表示水平排列,而 Y_AXIS 表示垂直排列。BoxLayout 的构造函数有两个参数,一个参数定义使用该 BoxLayout 的容器,另一个参数是指定 BoxLayout 是采用水平还是垂直排列(主要实现了那俩标记和俩文本框和按钮,在同一水平线)
第二个:Socket对象
那么首先我们就从原理来看一看。这个设计原理非常类似于平时打电话进行通讯:
(1)首先通讯双方各有一台电话机,在上述模型中就是Socket;
(2)通讯一方拔打电话,试图建立连接,在上述模型中就是客户端建立JavaSocket对象;另一方随时监听有没有呼叫,当有呼叫到来时,摘机,在上述模型中就是在服务器端建立一个JavaSocket对象,然后用其accept()方法监听客户端的连接请求,当有连接请求时accept方法返回客户端的Socket,于是双方就建立起连 接;
(3)双方通话,过程中双方都可以说和听,在上述模型中,每个Socket可以利用输入输出流进行读和写两种操作;在电话中一方听到的是对方说出的,反之亦然;上述模型中,一方读出的也是对方写入的,而写入的则是对方要读出的
(4)挂断。
第三个:integer.parseint
Integer.parseInt()是把()里的内容转换成整数。baiInteger.parseInt(String)遇到一些不能被转换为整型的字符时,zhi会抛出异常。Integer.parseInt(String)的作用就是将String字符类型数据转换为Integer整型数据。