마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

자바서버와 안드로이드 채팅 클라이언트 간의 질문입니다.

0 추천

인터넷에서 자바채팅서버 클라이언트 예제를보고 연습하고 안드로이드 채팅클라이언트와 연결을 시도햇는데요

 

소켓연결에서 Excetion으로 넘어가서 접속이 안되네요 ㅠㅠ

 

안드로이드쪽에서 매니페스트 파일에서 android.permission.INTERNET 추가햇는데 갑자기 프로그램 전체가 약간씩 커지고

 

채팅클라이언트로 접속 시도하면 검은화면만 뜨고 접속하면 무지하게 렉걸리더니 한 1분쯤 후에 타임아웃뜹니다.

 

import java.awt.BorderLayout;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;







public class ChatSv extends JFrame{
	
	JPanel pnl; // 패널 생성
	JTextField tx_PORT; // 포트번호 입력받음
	JButton accept; // 서버실행 버튼
	int PORT;
	ServerSocket svsock;
	Socket sock;
	Vector v = new Vector();	//유저정보를 저장하기 위한 벡터
	Dialog ok;
	
	private TextArea display; // 서버상태 메시지 창
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		ChatSv sv = new ChatSv();
		sv.setDefaultCloseOperation(EXIT_ON_CLOSE);
		

		
	}
	
	public ChatSv() {
		// TODO Auto-generated constructor stub
		
		display = new TextArea();
		pnl = new JPanel(new FlowLayout());	
		accept = new JButton("연결");
		tx_PORT = new JTextField(5);	
		add(display,BorderLayout.CENTER);	
		add(pnl,BorderLayout.NORTH);	
		pnl.add(tx_PORT);			
		pnl.add(accept);			
		

		accept.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				
				if(tx_PORT.getText().equals("")) 
				{
					PORT = 8090;
					ok = new Dialog(new Frame(),"알림");
					Label lb = new Label("입력값이 없어 기본값 포트 8090 으로 연결합니다.");
					ok.setSize(500, 100);
					runSv();  
					ok.add(lb);

					
					ok.addWindowListener(new WindowAdapter() {	
						  public void windowClosing( WindowEvent e ) {
							 ok.setVisible(false);
							   }
					});
					ok.show();
				}
				else
				{
					try{
						
						PORT = Integer.parseInt(tx_PORT.getText().toString());
					
						runSv();  
					}
					catch(Exception e)
					{
						ok = new Dialog(new Frame(),"알림");
						Label lb = new Label("포트번호 입력 에러입니다 다시한번 확인해주세요.");
						ok.setSize(500, 100);

						ok.add(lb);
						ok.setVisible(true);
						ok.addWindowListener(new WinListener(ok));
						

						
					
						
					}
				}
				
				
			}
		});
		
		
		setSize(400,300);
		setVisible(true);
		
	}
	class WinListener extends WindowAdapter
	{
		public WinListener(Dialog ok)	
		{}
		
		public void windowClosing(WindowEvent e)
		{
			ok.setVisible(false);
		}
	}
	
	
	public void runSv()		
	{
		try{
			
			svsock =  new ServerSocket(PORT);
			accept.setText("서버 실행중...");
			display.enable(false);
			
			if(svsock!=null)	
			{
				Threadon();
			}
		
		}
		catch(Exception e)
		{
			
			display.append("소켓 생성 오류입니다.");
		


		}
	}
	
	private void Threadon()
	{
		Thread td = new Thread(new Runnable() {	
			
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				while(true){
					try{
					
						display.append("서버가 시작되었습니다.\n연결 대기중...\n"); 
						sock = svsock.accept();
						display.append("\n 연결이 완료되었습니다.\n");
						
						SvSock sv = new SvSock(sock,v);
						
						v.add(sv);
						
						sv.start();
					
					}
					catch(Exception e)
					{
						display.append("Accept 에러");
					}
				}
				
				
				
			}
		});
		
		td.start();
	}
	
	
	class SvSock extends Thread
	{
		InputStream is;
		OutputStream os;
		DataInputStream dis;
		DataOutputStream dos;
		
		Socket us_sock;
		Vector us_v;
		
		String Nick;
		
		
		
		public SvSock(Socket sock, Vector v)
		{
			
			this.us_sock = sock;
			this.us_v = v;
			
			try{
				
				is = us_sock.getInputStream();
				os = us_sock.getOutputStream();
				dis = new DataInputStream(is);
				dos = new DataOutputStream(os);
				
				Nick = dis.readUTF();
				display.append("\n ------ " + Nick + " 님이 서버에 접속하셧습니다,\n");
				
				SendMs("포트번호 :  " + PORT + " 접속 완료");
			}
			catch(Exception e)
			{
				e.printStackTrace();
				display.append("소켓에러");
			}
			
		}
		public void SendMs(String str)
		{
			try			
			{
				dos.writeUTF(str);
			}
			catch(IOException e)		
			{
				display.append("Write 에러");
			}
		}
		public void RcvMs(String str) {
			display.append("받은 메세지 : " + str+"\n");
			
			MsAll(str);

		}
		public void MsAll(String str)				// 
		{
	
				for (int i = 0; i < us_v.size(); i++) {
					SvSock imsi = (SvSock) us_v.elementAt(i);
					imsi.SendMs(Nick+" : "+str);
				}
	

			
		}
		public void run()
		{
			while(true)
				{
					try
					{
						String Ms = dis.readUTF();			
						RcvMs(Ms);
					}
					catch(IOException e)
					{
						try {
							dos.close();
							dis.close();
							us_sock.close();
							v.removeElement( this ); 
							display.append(v.size() +" : 현재  사용자 수\n");
							display.append("사용자 접속 끊어짐 자원 반납\n");
							break;
						
						} catch (Exception ee) {
						
						}
					}
				}
				
		}
	}
	


	
}

 



public class Chat extends Activity{
	
	
	//String IP ="192.168.15.10";
	int PORT=8090;
	String Nick;
	
	EditText inMs;
	TextView display;
	Button btn_send;
	
	Socket sock;
	OutputStream os;
	InputStream is;
	DataInputStream dis;
	DataOutputStream dos;
	

	
	
	
	
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chat_form);
        
        Intent rcv = getIntent();
        
        inMs = (EditText) findViewById(R.id.Inms);
        display = (TextView) findViewById(R.id.display);
        btn_send = (Button) findViewById(R.id.sendchat);
        Nick = rcv.getStringExtra("Nick");
        
        display.append(Nick + "\n");
        
        btn_send.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				SendMs(inMs.getText().toString());		
				inMs.setText("");
				
			}
		});
        
		
		SvCon();
		
    
		
		
	}
	public void SvCon()
	{
		try{
			
			sock = new Socket("192.168.15.10",PORT);
			if(sock != null)
			{
				try
				{
					is = sock.getInputStream();
					os = sock.getOutputStream();
				
					dis = new DataInputStream(is);
					dos = new DataOutputStream(os);
				}
				catch(IOException ee)
				{
					display.append("Stream Error.\n");
				}
				
				SendMs(Nick);
				
				Thread td = new Thread(new Runnable() {	
					
					
					@Override
					public void run() {
						// TODO Auto-generated method stub
						while(true){
							try{
							
									String Ms = dis.readUTF();			
									display.append(Ms + "\n");
							
							}
							catch(Exception e)
							{
								display.append("서버 연결 에러");
							}
						}
						
						
						
					}
				});
				
				td.start();
				
			}
		}
		catch(Exception e)
		{
			display.append("Sock Error.\n" +e);
		}
	}
	public void SendMs(String str)			
	{
		try			
		{
			dos.writeUTF(str);
		}
		catch(IOException e)		
		{
			display.append("Write 에러");
		}
	}
}

 

이 액티비티 실행하면

 

Sock Error.

java.net.ConnectException: failed to Connect to /192.168.15.10 (port 8090): connect failed: ETIMEOUT(Connection timed out) 

 

위에 그대로 출력됩니다.

 

자바클라이언트로 실행시켯을때는 문제없이 실행됫구여

 

제 집 인터넷환경이 SK브로드밴드 인터넷전화기 사용중인데 관련있는 문제인가요 

 

 

넥센우승 (140 포인트) 님이 2014년 6월 16일 질문

1개의 답변

0 추천
내부 아이피 문제 입니다..같은 사설ip 대역대를 사용하셔아 하는데..같은 공유기를 사용해보시거나 서버를 공인ip로 해야합니다
YeonMin (17,860 포인트) 님이 2014년 6월 17일 답변
...